多cpu下SetThreadAffinityMask运用框架
Author:zfive5(zidong)Email :zfive5@yahoo.com.cn
“舍”的目的,是为了“得”!
随着多cpu机器的普及时代的到来,大家对机器速度的提升感到欣喜若狂的同时,对cpu的掌控能力越来越差了,也许大家对这块也不是特别注意或感兴趣,但如果真等到需要这方面的答案时,又会无言,例如:
mov eax,1
这条指令在core2的机器上想在cpu1(这里为了区别另一个cpu而给它取的名称罢了)上执行?而不是让操作系统根据它的调度算法去选择1或2,估计大家只能保持沉没!感慨大家现在都让操作系统包装成了高科技的傻子,本着不想让操作系统玩弄鼓掌的态度,我在msdn游荡了数小时,为的是一个api的出现,终于SetThreadAffinityMask出现了,说真的此时的心情就像佛教徒们看到了佛祖猞猁那样!关于SetThreadAffinityMask这个函数的介绍大家可以到msdn去搜!
下面写一个SetThreadAffinityMask框架,大家去以后需要套用即可!
static DWORD WINAPI ZFive5Proc(LPVOID p){ //自己需要控制代码开始 _asm{ push eax mov eax,1 pop eax } sprintf((char*)p,"zfive5! good"); //自己需要控制代码结束
return 0;}
void CCPUDlg::OnOK() { // TODO: Add extra validation here //CDialog::OnOK();
char szbuf[200]; DWORD id; HANDLE hHandle=CreateThread(NULL,0,ZFive5Proc,&szbuf,CREATE_SUSPENDED ,&id); if(hHandle==NULL) { AfxMessageBox("zfive5! error"); return; } //CPU1 SetThreadAffinityMask(hHandle,1); //CPU2 //SetThreadAffinityMask(hHandle,2); ResumeThread(hHandle); if(WaitForSingleObject(hHandle,INFINITE)!=WAIT_OBJECT_0) { AfxMessageBox("zfive5! error"); CloseHandle(hHandle); return; }
CloseHandle(hHandle); //TRACE("%s/r/n",szbuf); AfxMessageBox(szbuf); return;
}
这样就可以让线程的代码ZFive5Proc在cpu1上执行了!
写到这里想起了我中熊猫烧香的经历,就是鼠标点了一下跟目录的图标(windows隐藏了autorun.inf运行)!
昨天看kaspersky,发现它的界面是通过贴窗体来实现的!今天在同事的机器上看到macfee,发现界面很一般!