3 回答

TA貢獻1799條經驗 獲得超6個贊
這是我為了使生活更輕松而制作的包裝紙。它的作用是使調用線程被“塞住”到具有id的內核core_id:
// core_id = 0, 1, ... n-1, where n is the system's number of cores
int stick_this_thread_to_core(int core_id) {
int num_cores = sysconf(_SC_NPROCESSORS_ONLN);
if (core_id < 0 || core_id >= num_cores)
return EINVAL;
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(core_id, &cpuset);
pthread_t current_thread = pthread_self();
return pthread_setaffinity_np(current_thread, sizeof(cpu_set_t), &cpuset);
}

TA貢獻1773條經驗 獲得超3個贊
假設Linux:
設置相似性的界面是-您可能已經發現:
int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);
傳遞0作為pid,它將僅適用于當前線程,或者讓其他線程通過linux特定的調用報告其內核pid pid_t gettid(void);并將其作為pid傳遞。
引用手冊頁
親和力掩碼實際上是每個線程的屬性,可以針對線程組中的每個線程分別進行調整。調用gettid(2)返回的值可以在pid參數中傳遞。將pid指定為0將為調用線程設置屬性,并將從調用返回的值傳遞給getpid(2)將為線程組的主線程設置屬性。(如果使用的是POSIX線程API,請使用pthread_setaffinity_np(3)而不是sched_setaffinity()。)

TA貢獻1828條經驗 獲得超3個贊
//compilation: gcc -o affinity affinity.c -lpthread
#define _GNU_SOURCE
#include <sched.h> //cpu_set_t , CPU_SET
#include <pthread.h> //pthread_t
#include <stdio.h>
void *th_func(void * arg);
int main(void) {
pthread_t thread; //the thread
pthread_create(&thread,NULL,th_func,NULL);
pthread_join(thread,NULL);
return 0;
}
void *th_func(void * arg)
{
//we can set one or more bits here, each one representing a single CPU
cpu_set_t cpuset;
//the CPU we whant to use
int cpu = 2;
CPU_ZERO(&cpuset); //clears the cpuset
CPU_SET( cpu , &cpuset); //set CPU 2 on cpuset
/*
* cpu affinity for the calling thread
* first parameter is the pid, 0 = calling thread
* second parameter is the size of your cpuset
* third param is the cpuset in which your thread will be
* placed. Each bit represents a CPU
*/
sched_setaffinity(0, sizeof(cpuset), &cpuset);
while (1);
; //burns the CPU 2
return 0;
}
在POSIX環境中,可以使用cpusets來控制進程或pthread可以使用哪些CPU。這種類型的控制稱為CPU關聯。
函數“ sched_setaffinity”接收pthread ID和cpuset作為參數。當您在第一個參數中使用0時,調用線程將受到影響
- 3 回答
- 0 關注
- 994 瀏覽
添加回答
舉報