先介紹三個函數
一、pthread_setafftinity_np
在Linux上,我們可以使用pthread特定的pthread_setafftinity_np函數。通過設置其親和性將每個線程固定到單個CPU
//設置CPU親和度,為0表示設置成功,非0值表示失敗 int rc =pthread_setaffinity_np(p[i].native_handle(),sizeof(cpu_set_t), &cpuset);
第一個參數是線程的句柄,第二個參數是CPU集合的大小,第三個參數是CPU集合的地址
線程和內核綁定成功返回值為0,失敗返回一個非0值
二、sysconf(_SC_NPROCESSORS_CONF);
//獲取電腦CPU內核的數量 int cpu_num; cpu_num = sysconf(_SC_NPROCESSORS_CONF); cout<<"cpu_num="<<cpu_num<<endl;
三、cpu_set_t結構體
cpu_set_t這個結構體了。這個結構體的理解類似於select中的fd_set,可以理解為cpu集,也是通過約定好的宏來進行清除、設置以及判斷:
有下列幾種操作
//初始化,設為空 void CPU_ZERO (cpu_set_t *set); //將某個cpu加入cpu集中 void CPU_SET (int cpu, cpu_set_t *set); //將某個cpu從cpu集中移出 void CPU_CLR (int cpu, cpu_set_t *set); //判斷某個cpu是否已在cpu集中設置了 int CPU_ISSET (int cpu, const cpu_set_t *set);
完整代碼
#include <stdio.h> #include <iostream> #include <thread> #include <pthread.h> #include <mutex> #include <unistd.h> using namespace std; mutex _mutex; void func(int id,int cnt) { { lock_guard<mutex> lg(_mutex); cout<< "Thread id= " << id << ":running on CPU " <<sched_getcpu() << endl; } while (1) { } } int main() { int cpu_num; cpu_num = sysconf(_SC_NPROCESSORS_CONF); cout<<"cpu_num="<<cpu_num<<endl; thread p[4]; for(int i=0;i<4;i++){ p[i]=thread(func,i,10); //cpu_set_t這個結構體了。這個結構體的理解類似於select中的fd_set,可以理解為cpu集,也是通過約定好的宏來進行清除、設置以及判斷: cpu_set_t cpuset; //初始化,設為空 CPU_ZERO(&cpuset); //將某個cpu加入cpu集中 CPU_SET(i,&cpuset); //設置CPU親和度,為0表示設置成功,非0值表示失敗 int rc =pthread_setaffinity_np(p[i].native_handle(),sizeof(cpu_set_t), &cpuset); if(rc!=0){ cout<<"SET CPU ERROR!\n"; } } for(int i=0;i<4;i++){ p[i].join(); } return 0; }
將4個線程綁定在第一個和第三個CPU內核運行
將4個線程綁定在各自對應的4個CPU內核運行