SetThreadAffinityMask选择CPU某个核运行

SetThreadAffinityMask选择CPU某个核运行

SetThreadAffinityMask选择CPU某个核运行

函数说明:The SetThreadAffinityMask function sets a processor affinity mask for the specified thread.  (该函数设置一个核心运行线程)

函数原型:

DWORD_PTR SetThreadAffinityMask(
HANDLE hThread,
DWORD_PTR dwThreadAffinityMask
);

参数说明:

hThread:要限制哪个线程
dwThreadAffinityMask:要在哪个核心上运行线程

注意事项:

dwThreadAffinityMask必须是进程的亲缘性屏蔽的相应子集。返回值是线程的前一个亲缘性屏蔽。例如,可能有一个包含4个线程的进程,它们在拥有4个CPU的计算机上运行。如果这些线程中的一个线程正在执行非常重要的操作,而你想增加某个CPU始终可供它使用的可能性,为此你对其他3个线程进行了限制,使它们不能在CPU0上运行,而只能在CPU1、2和3上运行。因此,若要将3个线程限制到CPU1、2和3上去运行,可以这样操作:
[cpp]
//线程0只能在cpu 0上运行
SetThreadAffinityMask(hThread0,0x00000001);
//线程1,2,3只能在cpu 1,2,3上运行
SetThreadAffinityMask(hThread1,0x0000000E);
SetThreadAffinityMask(hThread2,0x0000000E);
SetThreadAffinityMask(hThread3,0x0000000E);
[/cpp]
 

测试环境:i3-4130(双核心四线程)
[cpp]
SetThreadAffinityMask(GetCurrentThread(), 0x00000001);//1 = 0 0 0 1,设置第一个核
SetThreadAffinityMask(GetCurrentThread(), 0x00000002);//2 = 0 0 1 0,设置第二个核
SetThreadAffinityMask(GetCurrentThread(), 0x00000004);//4 = 0 1 0 0,设置第三个核
SetThreadAffinityMask(GetCurrentThread(), 0x00000008);//8 = 1 0 0 0,设置第四个核
SetThreadAffinityMask(GetCurrentThread(), 0x00000003);//3 = 0 0 1 1,设置第一、二个核
SetThreadAffinityMask(GetCurrentThread(), 0x0000000F);//15 = 1 1 1 1,设置第一、二、三、四个核
[/cpp]

在核1上运行
在核1上运行

在核1234上运行
在核1234上运行

参考来源:[百度百科][MSDN官方]