指定线程在特定核心

来源:互联网 发布:英语基础自学软件 编辑:程序博客网 时间:2024/04/29 08:24

1原博部分:

转自   http://bukkake.iteye.com/blog/688383

今天遇到这么一个问题,有一个任务分上下行,都是计算复杂型的,如何保证用线程可以让他们运行在双核机器上的不同核心上充分利用CPU?

     我当时想了一下,认为线程的分配是操作系统处理的,如果足够精明的话,可以将线程合理分配。不过我回去查了查资料,竟然还真能指定CPU,就是用SetThreadAffinityMask,当然我也看到对此函数的批评,但实际运行效果确实还可以。
C代码  收藏代码
  1. #include <windows.h>  
  2. #include <stdio.h>  
  3. #define ThreadCount 2  
  4.   
  5. DWORD WINAPI func(LPVOID pvoid)  
  6. {  
  7.     while(1)  
  8.         ;  
  9.     return 0;  
  10. }  
  11.   
  12. int main()  
  13. {  
  14.     HANDLE threads[ThreadCount];  
  15.     int i;  
  16.     for (i = 0; i < ThreadCount; i++)  
  17.     {  
  18.         threads[i] = CreateThread(NULL, 0, func, NULL, 0, NULL);  
  19.         SetThreadAffinityMask(threads[i], 1<<i);  
  20.         if (threads[i] == NULL)  
  21.         {  
  22.             OutputDebugString(L"CreateThread Error!\n");  
  23.             exit(1);  
  24.         }  
  25.     }  
  26.     getchar();  
  27.     return 0;  
  28. }  

    根据自己机器不同核心数调整一下常量,就可以观察cpu们依次到达100%了。

    有兴趣的话还可以看SetThreadAffinityMask的返回值,其意义是该线程原先的亲缘性,我机器上返回是15,也就是00001111,大致也可以猜出意思是可以在四核上任意分配。

增加部分:

具体函数为:
1
DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);
其中,第一个参数为线程句柄,第二个参数为一个mask。
如果要知道当前线程的句柄,可以通过函数:GetCurrentThread()得到。否则,在创建多线程的时候,也同样可以得到创建的线程的句柄。
第二个参数为mask,可取值为0~2^31(32位)和0~2^63(64位),每一位代表每一个CPU是否使用。
比如,你要指定进程到第0个CPU上,则mask=0×01
第1个CPU:mask=0×02
第2个CPU:mask=0×04 (注意不是0×03)
第3个CPU:mask=0×08
以此类推。
如果要指定多个CPU:
比如第0、1个:mask=0×03
第1、2个:mask=0×06
以此类推。
如果CPU个数不足,则会进行取模操作。比如一共4个CPU,则mask=0×0010则和0×01一样。



0 0