[并发并行]_[Windows]_[指定程序执行的CPU]
来源:互联网 发布:最新前端技术编程语言 编辑:程序博客网 时间:2024/05/22 03:19
场景
在编写音视频转换或者需要CPU密集型运算的应用时,一般会开启多线程进行并发执行,而多线程往往就会使用多个CPU. 这时候如果把CPU都用完了,CPU 使用率达到很高的话,就会影响电脑桌面的其他任务的执行,比如点击界面的软件,鼠标移动都会卡.
这时候如果只使用一半的CPU的话应该就不会影响用户的正常操作了.
- Win32 函数 SetProcessAffinityMask 就可以解决这个问题.
参考
用SetProcessAffinityMask为进程指定CPU
SetProcessAffinityMask function
Example usage of SetProcessAffinityMask in C/C++
例子
这个例子测试只使用第3,4的内核执行当前进程任务.
// test_cpu.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <Windows.h>#include <time.h>#include <assert.h>#include <iostream>bool SetWorkProcessor(int n,...){ // On a system with more than 64 processors, // the affinity mask must specify processors in a single processor group assert(n < 64); HANDLE process = GetCurrentProcess(); DWORD_PTR processAffinityMask; DWORD_PTR systemAffinityMask; if (!GetProcessAffinityMask(process, &processAffinityMask, &systemAffinityMask)) return false; // 获取CPU个数 SYSTEM_INFO info; ::GetSystemInfo(&info); // 设置处理器 va_list argptr; va_start(argptr, n); int result = 0; for(int i = 0;i<n;++i) { int value = va_arg(argptr, int); if(value < info.dwNumberOfProcessors) { result |= (1 << value); } } va_end(argptr); if(result) { return SetProcessAffinityMask(process,result); } return false;}DWORD WINAPI ThreadFunc(PVOID pvParam){ int i = 0; while(true) { ++i; } return 0;}int _tmain(int argc, _TCHAR* argv[]){ // 设置使用的CPU assert(SetWorkProcessor(2,2,3)); DWORD dwThreadID; for(int i = 0; i < 10; ++i) { CreateThread(NULL,0,ThreadFunc,NULL,0,&dwThreadID); } int i = 0; while(true) { ++i; } return 0;}
图1 未执行程序前,3,4 CPU使用率并不高
图2 执行程序后,3,4 CPU使用率暴涨,但是1,2 CPU没怎么变化.
图3 不设置CPU处理函数,看4个CPU使用率吓人.
0 0
- [并发并行]_[Windows]_[指定程序执行的CPU]
- [并发并行]_[任务停止]_[使用Pthread的线程本地存储来停止任务执行]
- [并发并行]_[线程同步]_[Windows用户态下的原子访问的互锁函数]
- [Windows]_[MacOSX]_[获取程序的执行文件所在路径(目录)]
- 多线程_多线程举例及并行和并发的区别
- [并发并行]_[pthread]_[线程池的简单设计与实现]
- [并发并行]_[线程同步]_[pthread和win32的临界区(Critical Section)比较]
- [并发并行]_[Object-C]_[使用NSMutableArray等非线程安全集合类的注意事项]
- [并发并行]_[初级]_[C++实现sychronized方式的对象锁]
- [并发并行]_[C/C++]_[C++标准库里的线程安全问题]
- [并发并行]_[线程取消]_[Pthread的线程取消特性]
- [并发并行]_[线程池]_[Programming With POSIX Threads的线程池实现分析1]
- 【VS2013】windows多线程编程_并行评测
- [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]
- 操作系统_并行和并发的区别 进程和线程的区别
- [并发并行]_[pthread]_[使用线程池并发复制文件]
- [并发并行]_[中级]_[实现Pthread线程并发读写锁rwlock]
- [Windows]_[初级]_[监听指定目录文件夹中文件的变化]
- jQuery常用方法2
- 五种排序的思想及其基本实现
- Java IO:BufferedInputStream使用详解及源码分析
- 支付宝集成获取私钥与公钥
- 欢迎使用CSDN-markdown编辑器
- [并发并行]_[Windows]_[指定程序执行的CPU]
- HTTP: Status code
- ceilometer + gnocchi + aodh集成(003) ---- ceilometer对接gnocchi
- jQuery中$.fn的用法示例介绍
- KMDF工程新增source文件出现的"TraceEvents未定义”编译错误
- Codeforces 282E Sausage Maximization (Trie)
- scrollview添加自定义view的滑动显示问题
- ZigBee无线传感器网络远程数据采集系统设计
- 青花瓷的使用