如何将线程/进程在一个/多个CPU核上运行
设置线程/进程与CPU的亲缘性,就是将线程/进程与CPU核进行绑定起来。
实现方法:
设置线程与指定cpu核绑定:SetThreadAffinityMask(GetCurrentThread(),mask);
设置进程与指定cpu核绑定:SetProcessAffinityMask(GetCurrentProcess(),mask);
参数说明:mask是CPU序号的或运算值:1(00000001)表示只运行在CPU第一个核上,2(00000010)表示只运行在CPU第二个核上,3(00000011)表示运行在CPU第一和第二个核上,4(00000100)表示只运行在CPU第三个核上,以此类推设置绑定对应的CPU核。
#include <iostream>
#include <Windows.h>
#include <thread>
using namespace std;
void t();
void t1(int cpu)
{
int a = 0, b = 0;
SetThreadAffinityMask(GetCurrentThread(), cpu);//绑定线程与cpu核
int cpu_num = GetCurrentThreadNumber();//获取当前线程在对应的cpu核上运行
cout << cpu_num;
while (true)
{
// cout << (a++) + (b++);//注:在这个循环中,使用cout一直打印输出时,因为一直与外设打交道所以会出现还有一个cpu在运行状态
//int c= (a++) + (b++);
//int d = c++;
}
}
int main() {
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
printf("cpu num is %d\n", sysInfo.dwNumberOfProcessors);//cpu核个数
std::thread fun1(t1,0x08);//在cpu3上运行
std::thread fun2(t1, 0x04);//在cpu2上运行
std::thread fun3(t1, 0x02);//在cpu1上运行
system("pause");
return 0;
}
任务管理器查看运行情况: