多執行緒程式設計之執行緒繫結處理器核

2021-06-12 18:25:51 字數 1749 閱讀 9480

出處:

linux系統提供api函式sched_setaffinity和sched_getaffinity用於設定或獲取執行緒的可以使用的cpu核。

int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);

這個函式中pid表示需要設定或獲取繫結資訊的執行緒id(或程序id),如果為0,表示對當前呼叫的執行緒進行設定;第2個引數cpusetsize一般設定為sizeof(cpu_set_t),用以表示第3個引數指向的記憶體結構物件的大小;第3個引數mask指向型別為cpu_set_t物件的指標,用以設定或獲取指定執行緒可以使用的cpu核列表。linux提供函式cpu_zero、cpu_set和cpu_isset對cpu_set_t型別的物件進行操作,其中cpu_zero用於清空cpu_set_t型別物件的內容,cpu_set用於設定cpu_set_t型別物件,cpu_isset用於判斷cpu_set_t型別物件與核對應的位是否被設定。下面通過簡單的**示例來說明這兩個函式的具體用法。

設定執行緒繫結**:

cpu_set_t mask;

int blist[8]=; //設定需要繫結的核列表

#pragma omp parallel private(mask)

該段**將paralle region裡面的8個執行緒依次繫結到核2,5,13,9,3,6,7,4。同樣可以使用sched_getaffinity函式獲取執行緒的能夠使用的核的列表,示例**如下:

int num_processors = sysconf(_sc_nprocessors_conf); //獲取當前節點核的數目

cpu_set_t get;

int i = 0;

cpu_zero(&get);

sched_getaffinity(0, sizeof(cpu_set_t), &get); //獲取當前呼叫執行緒的可以使用的核

for(i = 0; i < num_processors; i++)

}下面是乙個完整的例子

檔案bind.c

#include

#include

#include

#include

#include

#define __use_gnu

#include

#include

#include

#include

#define thread_max_num 100  //1個cpu內的最多程序數

int num=0;  //cpu中核數

void* threadfun(void* arg)  //arg  傳遞執行緒標號(自己定義)

while (1)

int i;

for (i = 0; i < num; i++)}}

return null;

}int main(int argc, char* argv)

for(i=0; i< num; i++)

return 0;

}編譯命令:gcc bind.c -o bind -lpthread

執行:./bind

輸出結果:略

特別注意:

#define __use_gnu不要寫成#define _use_gnu

#include必須寫在#define __use_gnu之後,否則編譯會報錯

檢視你的執行緒情況可以在執行時在另乙個視窗使用top -h來檢視執行緒的情況,檢視各個核上的情況請使用top命令然後按數字「1」來檢視。

多執行緒程式設計之執行緒取消

關鍵 pthread cancel函式傳送 終止訊號 pthread setcancelstate函式 設定終止方式 pthread testcancel函式取消執行緒 另一功能是 設定取消點 1 執行緒取消的定義 一般情況下,執行緒在其主體函式退出的時候會自動終止,但同時也可以因為接收到另乙個執行...

繫結執行緒到特定CPU處理器

參考這篇文章 如下 define gnu source include include include include include include void myfun void arg cpu zero get if pthread getaffinity np pthread self si...

關於處理器的多核多執行緒

cpu的多核是指cpu的處理器核心數量 cpu的多執行緒是指同乙個處理器上的多個執行緒同步執行並共享處理器的執行資源的執行緒數量 處理器核心 core 又稱為核心,是cpu最重要的組成部分。cpu中心那塊隆起的晶元就是核心,是由單晶矽以一定的生產工藝製造出來的,cpu所有的計算 接受 儲存命令 處理...