MFC让进程利用所有处理器核心
参考资料:
http://blog.csdn.net/baodi_z/article/details/1857820
http://blog.csdn.net/cbnotes/article/details/38845069
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686223(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683213(v=vs.85).aspx
简单说下步骤:
1、GetSystemInfo获取系统配置的处理器个数
2、用GetProcessAffinityMask和SetProcessAffinityMask确保当前进程可用系统配置的所有处理器
3、开启跟处理器个数相同的工作线程去做计算,为了充分利用CPU做计算,工作线程里面尽量不要存在有线程同步的代码(例如DEMO中的TRACE),除非有线程安全的需求必须这么做。
做了个简单的DEMO来测试
我的计算机用的处理器是 Intel i7 6700HQ,4核心的,经过测试,工作线程在达到4个的时候CPU就跑到100%了,3个工作线程只能跑到75%左右。最开始因为在计算循环里面放了TRACE,导致即便开了4个工作线程CPU也只能跑到50%,可见线程同步对CPU利用率的损耗有多大。
代码如下:
MyApp.h
#pragma once #include <afxwin.h> class CMyApp :
public CWinApp
{
public:
virtual BOOL InitInstance();
};
MyApp.cpp
#include "MyApp.h" using namespace std; class CMainWindow :
public CFrameWnd
{
public:
CMainWindow();
DECLARE_MESSAGE_MAP()
afx_msg void OnClose();
}; CMainWindow::CMainWindow()
{
Create(NULL, _T("The Hello Application"), WS_OVERLAPPED | WS_CAPTION |
WS_SYSMENU | WS_MINIMIZEBOX | WS_THICKFRAME,
CRect(, , , ));
} CMyApp myApp; #define NUM_WORKER 4 // 工作线程个数 CWinThread* pWorker[NUM_WORKER]; // 工作线程
HANDLE hWorker[NUM_WORKER]; // 工作线程HANDLE #define DATA_COUNT 20000 // 数据量
#define ROUNDS 4000 // 计算循环次数 // 耗时计算任务
UINT Task(LPVOID pParam)
{
double data[DATA_COUNT];
double result = 1.0;
for (int i = ; i < ROUNDS; ++i)
{
//TRACE(_T("[%d]Computing, Round[%d/%d]\n"), ::GetCurrentThreadId(), i, ROUNDS); // TRACE这个东西是线程安全的,线程同步问题导致CPU利用率上不去
for (int j = ; j < DATA_COUNT; ++j)
data[j] = (double)(::rand()*(1.0 / RAND_MAX));
for (int j = ; j < DATA_COUNT; ++j)
{
data[j] = (double)::sin(::cos(data[j]));
result *= data[j];
result /= data[j];
}
}
TRACE(_T("[%d]Exiting\n"), ::GetCurrentThreadId());
return ;
} // 主线程(UI)
BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow(); SYSTEM_INFO SysInfo;
::GetSystemInfo(&SysInfo); TRACE(_T("处理器个数:%d\n"), SysInfo.dwNumberOfProcessors); HANDLE hProcess = ::GetCurrentProcess(); // 本进程的HANDLE
DWORD dwSysMask, dwProcessMask; // 系统配置的所有处理器,本进程可用的处理器 ::GetProcessAffinityMask(hProcess, &dwProcessMask, &dwSysMask); // 获取 dwSysMask, dwProcessMask if (dwProcessMask != dwSysMask) // 确保本进程可以使用系统配置的所有处理器
{
dwProcessMask = dwSysMask;
::SetProcessAffinityMask(hProcess, dwProcessMask);
} // 创建工作线程
for (int i = ; i < NUM_WORKER; ++i)
{
CWinThread* pThread = ::AfxBeginThread(Task, NULL, THREAD_PRIORITY_NORMAL, , CREATE_SUSPENDED);
pThread->m_bAutoDelete = FALSE;
pWorker[i] = pThread;
hWorker[i] = pThread->m_hThread;
}
// 启动工作线程
for (int i = ; i < NUM_WORKER; ++i)
{
pWorker[i]->ResumeThread();
} return TRUE;
} BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_CLOSE()
END_MESSAGE_MAP() // 退出主线程
void CMainWindow::OnClose()
{ ::WaitForMultipleObjects(NUM_WORKER, hWorker, TRUE, INFINITE); for (int i = ; i < NUM_WORKER; ++i)
{
delete pWorker[i];
} CFrameWnd::OnClose();
}
MFC让进程利用所有处理器核心的更多相关文章
- linux进程的地址空间,核心栈,用户栈,内核线程
linux进程的地址空间,核心栈,用户栈,内核线程 地址空间: 32位linux系统上,进程的地址空间为4G,包括1G的内核地址空间,和3G的用户地址空间. 内核栈: 进程控制块task_struct ...
- Nginx 关于进程数 与CPU核心数相等时,进程间切换的代价是最小的-- 绑定CPU核心
在阅读Nginx模块开发与架构模式一书时: "Nginx 上的进程数 与CPU核心数相等时(最好每个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的;" &am ...
- Python如何利用多核处理器
Python中,如果想使程序充分利用多核处理器,有以下几个方案: l 使用threading模块,然后将程序运行在IronPython或Jython之上. l 使用Python自带的multiproc ...
- MFC防止进程重复建立
原文:https://blog.csdn.net/zhang11wu4/article/details/7100839 在APP类的InitInstance()的最前面加入以下代码,建立互斥区,可防止 ...
- mfc HackerTools进程令牌设置为debug权限
博客园:https://www.cnblogs.com/ndyxb/p/12734717.html 要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作, ...
- 如何查看Mac电脑的处理器核心数目-CPU的核心数目
1.通过点击关于本机来查看
- 令人无限遐想的各种PCIe加速板卡
声明 本文不涉及不论什么特定API,也不针对不论什么特定的厂商,可是仍然值得透露一点的是,某些加速板卡厂商的成功点和失败点恰恰都是在于其通用性,在这个人们依旧依赖专业板卡的时代,依旧将板卡视为解决专业 ...
- mac专业视频剪辑软件 Final Cut Pro 10.4.6破解版
Final Cut Pro简称FCP,它是 Mac平台上最好的视频剪辑软件,可用来视频剪辑.后期特效等.可编辑从标清到4K的各种分辨率视频,ColorSync管理的色彩流水线则可保证全片色彩的一致性. ...
- (数据科学学习手札86)全平台支持的pandas运算加速神器
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 随着其功能的不断优化与扩充,pandas已然成为 ...
随机推荐
- ceph-RGW Jewel版新概念
一.概述 zone: 包含多个RGW实例的一个逻辑概念.zone不能跨集群,同一个zone的数据保存在同一组pool中: zonegroup:一个zonegroup如果包含一个或多个zone,如果包含 ...
- 【java】解析JToolBar类的使用
1.简介 在大部分的Look and Feels下,用户都可以把该工具条拖离原Window组件(除非floatable属性设置为false).为了能够正常的实现拖动效果,该类的实例被建议添加到Bord ...
- 【C语言】为什么指明数组的列数?
首先,我们拿二维数组为例.二维数组称为矩阵.二维数组在概念上是二维的,但实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的.如果将二维数组作为参数传递给函数,那么在函数的参数声明中必 ...
- kafka中处理超大消息的一些处理
Kafka设计的初衷是迅速处理短小的消息,一般10K大小的消息吞吐性能最好(可参见LinkedIn的kafka性能测试).但有时候,我们需要处理更大的消息,比如XML文档或JSON内容,一个消息 ...
- 二进制安装mysql 5.6
创建用户和组 # groupadd mysql # useradd -r -g mysql mysql 解压压缩包 # tar -xvf mysql-5.6.37-linux-glibc2.12-x8 ...
- mysql - tmp_table_size & max_heap_table_size
Command-Line Format --tmp_table_size=# System Variable Name tmp_table_size Variable Scope Global, Se ...
- 删除vector指定位置的元素
原文链接: http://www.cnblogs.com/yeahgis/archive/2012/05/29/2523476.html #include <vector>#include ...
- python opencv 按一定间隔截取视频帧
前言关于opencvOpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. ...
- [转]IDEA 导出自己的jar包 并且在另一个工程中引用
1.导出jar包 1.1 idea导出jar包不如eclipse方便,但是熟练了也很容易操作 1.2 File -> Project Settings -> Artifacts(艺术品) ...
- Centos 7搭建Gitlab服务器超详细(转)
一. 安装并配置必要的依赖关系 在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问. 1.安装s ...