C++:指定CPU核心执行指定线程

为了尽可能地降低多线程间的耦合性以提高速度,我们让不同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 
#include 
#include 
#include 
#include 
 
//统计CPU核心数量
int countCPU(){
	//#include 
	//get_nprocs_conf();
	//get_nprocs();
	//#include 
	//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

形式2

#include 
#include 
#include 

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;
}

[参考]

你可能感兴趣的:(C++)