Linux將執行緒繫結到CPU核心執行
阿新 • • 發佈:2020-07-28
先介紹三個函式
一、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核心執行