linux C++ CPU亲和性

本文介绍如何使用pthread_setaffinity_np函数来指定线程在特定的CPU核心上运行,通过两个实例展示了如何设定线程的CPU亲和性,以优化多线程程序的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了尽可能地降低多线程间的耦合性以提高速度,我们让不同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;
}

[参考]

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值