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内核运行
等风起的那一天,我已准备好一切