概述
为了尽可能地降低多线程间的耦合性以提高速度,我们让不同CPU核心执行不同的线程。下面的程序可以指定哪个(些)核心去执行某个线程,主要部分是:
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(i, &mask);
pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask);
mask可以理解为一个集合,第2行清空mask,第三行把CPUi放入mask,还可以把更多CPUi放入mask。
假如这段代码在函数fac中,pthread_self()用于获取fac的线程ID,pthread_setaffinity_np把该ID与mask绑定,这样mask中的一个或多个CPU核心就负责执行该线程。如形式2。
形式1
#include <pthread.h>
#include <stdlib.h>
#include <sys/sysinfo.h>
#include <unistd.h>
#include <assert.h>
//统计CPU核心数量
int countCPU(){
//#include <sys/sysinfo.h>
//get_nprocs_conf();
//get_nprocs();
//#include <unistd.h>
//sysconf(_SC_NPROCESSORS_CONF);
return sysconf(_SC_NPROCESSORS_ONLN);
}
void *fun(){
while(1);
}
int main(int argc, char *argv[]){
int i, cpu_nums = countCPU();
cpu_set_t cpuset[cpu_nums];//cpuset[i]是负责执行某个线程的若干个CPU核
pthread_t Thread[cpu_nums];//存放线程ID,ID由函数pthread_create分配
for (i=0; i<cpu_nums; i++){
CPU_ZERO(cpuset+i);//清空cpuset[i]
CPU_SET(i, cpuset+i);//cpuset[i]中只放了一个CPU核,如果需要可以继续放
pthread_create(&Thread[i], NULL, fun, NULL);//创建线程
//参数1:线程ID 参数3:执行这个线程的若干个CPU核
assert(!pthread_setaffinity_np(Thread[i], sizeof(cpu_set_t), cpuset+i));
}
for(i = 0; i < cpu_nums; ++i)
pthread_join(Thread[i],NULL);
exit(EXIT_SUCCESS);
}
形式2
#include <unistd.h>
#include <pthread.h>
#include <assert.h>
void *fun(void *i){
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(*(int *)i, &mask);
assert(!pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask));
while(1){
//Todo
}
}
int main (int argc, const char * argv[]){
int cpu_nums = sysconf(_SC_NPROCESSORS_CONF);
int i, tmp[cpu_nums];
pthread_t Thread[cpu_nums];
for(i = 0; i < cpu_nums; ++i){
tmp[i] = i%3;//这是一个参数,让fun函数被核i%3执行
pthread_create(&Thread[i], NULL, fun, &tmp[i]);
}
for(i = 0; i < cpu_nums; ++i)
pthread_join(Thread[i],NULL);
return 0;
}
[参考]
最后
以上就是优雅鼠标为你收集整理的linux C++ CPU亲和性的全部内容,希望文章能够帮你解决linux C++ CPU亲和性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复