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内核运行

 

posted @ 2020-07-28 10:11  知道了呀~  阅读(2836)  评论(0编辑  收藏  举报