为何几个线程(2个CPU)只在一个CPU上运行?

为什么几个线程(2个CPU)只在一个CPU上运行?????
本帖最后由 VisualEleven 于 2013-05-31 17:08:27 编辑
电脑上有两个CPU。
我在InitInstance中用:
bresult = SetProcessAffinityMask( GetCurrentProcess() , 3 ) ;
DWORD dwCPUid = SetThreadAffinityMask( GetCurrentThread() , 1 ) ;

(或DWORD dwCPUid = SetThreadIdealProcessor( GetCurrentThread() , 0 ) ; )
在另一个线程中使用
DWORD dwCPUid = SetThreadAffinityMask( GetCurrentThread() , 2 ) ;

(或DWORD dwCPUid = SetThreadIdealProcessor( GetCurrentThread() , 1 ) ; )

没有起作用,两个线程还是一直在CPU 0上运行,没有在CPU 1上运行。

在 任务管理器中也可以看到(右击进程名=>关系设置=>只有CPU0被选中,而CPU1没有被选中)CPU1没有被使用。 如果我在这里也把CPU 1也选中,第二个线程就能够在 CPU 1上运行===通过观察“性能”=>CPU使用率可知

(备注:我的程序为 基于对话框的MFC程序)

不知道是什么原因?   请各位赐教
多线程 性能优化 处理器

------解决方案--------------------
应该在线程还没跑的时候就设置了吧 都跑起来了还能设置?
------解决方案--------------------
本帖最后由 VisualEleven 于 2013-05-31 17:07:56 编辑
//Thread 0 can only run on CPU 0.   
  
SetThreadAffinityMask(hThread0, 0x00000001); //第0位是1   
  
//Threads 1, 2, 3 run on CPUs 1, 2, 3.//第1 2 3位是1   
  
SetThreadAffinityMask(hThread1, 0x0000000E);   
  
SetThreadAffinityMask(hThread2, 0x0000000E);   
  
SetThreadAffinityMask(hThread3, 0x0000000E);
  
------解决方案--------------------
HANDLE hTh1 = CreateThred (..., CREATE_SUSPENDED, NULL);
SetThreadAffinityMask(hThread0, 0x00000001); 
ResumeThread (hTh1);

------解决方案--------------------
HANDLE hTh1 = CreateThred (..., CREATE_SUSPENDED, NULL); // 创建一个“不运行”的线程
SetThreadAffinityMask(hTh1, 0x00000001);                 // 设置CPU
ResumeThread (hTh1);                                     // 运行该线程

------解决方案--------------------
引用:
>>>>> 应该在线程还没跑的时候就设置了吧 都跑起来了还能设置?
  不明白什么意思??? 是线程还没有生成 还是线程函数执行前???
  我把上叙代码放在 CxxApp的 构造函数中 效果一样。

>>>>>  //Thread 0 can only run on CPU 0.   
         SetThreadAffinityMask(hThread0, 0x00000001); //第0位是1 

我没有发现 与我上叙代码 有什么不同。 1 == 0x00000001 , 2 == 0x00000010
难道 GetCurrentThread() 有问题吗。
但 上叙函数调用 返回结果 没有提示错误。

感谢两位提供帮助。

很郁闷中,继续期待各位 指点!!!!!!!!!!!


你再看清楚一些,人家说的"位"是二进制的位,0x开头的是16进制数
你用电脑里的计算机打开看看,0x0000000e等于二进制的1110
------解决方案--------------------
一共只有两个CPU,CPU0 =0,CPU1=1  ,你那1,2 ,3 是什么!!!!!!!!