多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,发现界面很一般!