1. 程式人生 > 實用技巧 >Linux將執行緒繫結到CPU核心執行

Linux將執行緒繫結到CPU核心執行

先介紹三個函式

一、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核心執行