永发信息网

linux下怎样将线程分配到指定CPU

答案:1  悬赏:20  手机版
解决时间 2021-03-25 06:43
linux下怎样将线程分配到指定CPU
最佳答案
大概的介绍一下Linux 的指定CPU运行,包括进程和线程。linux下的top命令是可以查看当前的cpu的运行状态,按1可以查看系统有多少个CPU,以及每个CPU的运行状态。
可是如何查看线程的CPU呢?top
-Hp pid,pid就是你当前程序的进程号,如果是多线程的话,是可以查看进程内所有线程的CPU和内存使用情况。

pstree可以查看主次线程,同样的pstree -p pid。可以查看进程的线程情况。

taskset这个其实才是重点,可以查看以及设置当前进程或线程运行的CPU(设置亲和力)。

taskset -pc pid,查看当前进程的cpu,当然有的时候不只是一个,taskset -pc cpu_num pid ,cpu_num就是设置的cpu。

这样的话基本的命令和操作其实大家都知道了,接下来就是在代码中完成这些操作,并通过命令去验证代码的成功率。

进程制定CPU运行:

[cpp] view plain copy
#include
#include
#include
#include
#include
#define __USE_GNU
#include
#include
#include

int main(int argc, char* argv[])
{
//sysconf获取有几个CPU
int num = sysconf(_SC_NPROCESSORS_CONF);
int created_thread = 0;
int myid;
int i;
int j = 0;

//原理其实很简单,就是通过cpu_set_t进行位与操作
cpu_set_t mask;
cpu_set_t get;

if (argc != 2)
{
printf("usage : ./cpu num\n");
exit(1);
}

myid = atoi(argv[1]);

printf("system has %i processor(s). \n", num);

//先进行清空,然后设置掩码
CPU_ZERO(&mask);
CPU_SET(myid, &mask);

//设置进程的亲和力
if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
{
printf("warning: could not set CPU affinity, continuing...\n");
}
while (1)
{

CPU_ZERO(&get);
//获取当前进程的亲和力
if (sched_getaffinity(0, sizeof(get), &get) == -1)
{
printf("warning: cound not get cpu affinity, continuing...\n");
}
for (i = 0; i < num; i++)
{
if (CPU_ISSET(i, &get))
{
printf("this process %d is running processor : %d\n",getpid(), i);
}
}
}
return 0;
}

进程设置CPU运行,其实只能是单线程。多线程设定CPU如下:

[cpp] view plain copy
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include

void *myfun(void *arg)
{
cpu_set_t mask;
cpu_set_t get;
char buf[256];
int i;
int j;
//同样的先去获取CPU的个数
int num = sysconf(_SC_NPROCESSORS_CONF);
printf("system has %d processor(s)\n", num);

for (i = 0; i < num; i++) {
CPU_ZERO(&mask);
CPU_SET(i, &mask);
//这个其实和设置进程的亲和力基本是一样的
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
fprintf(stderr, "set thread affinity failed\n");
}
CPU_ZERO(&get);
if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {
fprintf(stderr, "get thread affinity failed\n");
}
for (j = 0; j < num; j++)
{
if (CPU_ISSET(j, &get))
{
printf("thread %d is running in processor %d\n", (int)pthread_self(), j);
}
}
j = 0;
while (j++ < 100000000) {
memset(buf, 0, sizeof(buf));
}
}
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t tid;
if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0)
{
fprintf(stderr, "thread create failed\n");
return -1;
}
pthread_join(tid, NULL);
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
16岁男生160厘米,有明显喉结,小鸡有多毛,还能
192.168.1.1/index.asp怎么修改wifi密码
八十平米的熡子能带多少暖气片
谁知道这些是什么意思?帮忙!!!急求!!!
柞木有那些好处
哪里买得到静谧与光明电子书
美国对中国进口加税,会不会对中国经济有影响
贴吧里说的火钳是什么意思
丰田致炫买哪款性价比好?
有个小萝莉一直喊尼咕尼咕尼的动漫好像是日本
地下城堡2怎么获得紫装
同志书屋怎么没有了
这颜值真的丑吗
学习围棋重要的技巧是什么,围棋一段和九段本
身上一天到晚总是很痒,天气太潮湿会起很多包
推荐资讯
帮忙答一下呗
为什么霜打过的菜就好吃???
奋斗就是生活,人生唯有前进。作者是?
光谱仪可以检测出硅和硼吗,国内的厂家说硼是
前任劈腿了好不甘心
03年款马自达六2.3高配的车有没有AUX接口啊?
如何把人人美剧下载到小米盒子上
江苏微盛微信小程序加盟代理好做吗?
魔兽世界地图之间怎么走
等边三角形,知道高是0.5米,低是6米,求边是多
-8m05+9m+22因式分解
数字推理:-2、6、-18、45、后面是多少?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?