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內核運行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM