|
|
今天遇到这么一个问题,有一个任务分上下行,都是计算复杂型的,如何保证用线程可以让他们运行在双核机器上的不同核心上充分利用CPU?
我当时想了一下,认为线程的分配是操作系统处理的,如果足够精明的话,可以将线程合理分配。不过我回去查了查资料,竟然还真能指定CPU,就是用SetThreadAffinityMask,当然我也看到对此函数的批评,但实际运行效果确实还可以。
#include <windows.h>#include <stdio.h>#define ThreadCount 2DWORD WINAPI func(LPVOID pvoid){while(1);return 0;}int main(){HANDLE threads[ThreadCount];int i;for (i = 0; i < ThreadCount; i++){threads[i] = CreateThread(NULL, 0, func, NULL, 0, NULL);SetThreadAffinityMask(threads[i], 1<<i);if (threads[i] == NULL){OutputDebugString(L"CreateThread Error!\n");exit(1);}}getchar();return 0;}
根据自己机器不同核心数调整一下常量,就可以观察cpu们依次到达100%了。
很遗憾的是这程序完全是自作多情,实际即使不用此函数,操作系统会自主将其分配到两个核心上去。我使用的是Win7,CPU为AMD620。
有兴趣的话还可以看SetThreadAffinityMask的返回值,其意义是该线程原先的亲缘性,我机器上返回是15,也就是00001111,大致也可以猜出意思是可以在四核上任意分配。
又是一篇好无聊的博客文章,我也是本着让自己以后看到可以惊呼“原来我当年这么弱智啊!”的同时充分体会到成长的优越感而用心良苦地记录下来。 |
|