我是Pthread的新手。我写了一个例子来检查我的线程在哪个CPU上运行。我使用了sched_getcpu((来获取调用线程当前正在执行的CPU的编号。这是我的代码:
#include <pthread.h>
#include <stdio.h>
void* a(){
printf("1st child thread in CPU %dn",sched_getcpu());
return NULL;
}
void* b(){
printf("2nd child thread in CPU %dn",sched_getcpu());
return NULL;
}
void* c(){
printf("3rd child thread in CPU %dn",sched_getcpu());
return NULL;
}
void* d(){
printf("4th child thread in CPU %dn",sched_getcpu());
return NULL;
}
void* e(){
printf("5th child thread in CPU %dn",sched_getcpu());
return NULL;
}
int main(){
pthread_t t;
pthread_t t1;
pthread_t t2;
pthread_t t3;
pthread_t t4;
pthread_create(&t,NULL,a,NULL);
pthread_create(&t1,NULL,b,NULL);
pthread_create(&t2,NULL,c,NULL);
pthread_create(&t3,NULL,d,NULL);
pthread_create(&t4,NULL,e,NULL);
pthread_join(t,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
pthread_join(t4,NULL);
printf("main thread in CPU %dn",sched_getcpu());
return 0;
}
显然,这个程序的输出在每次运行时都会发生变化。但这里有一个例子:
输出:
1st child thread in CPU 2
3rd child thread in CPU 2
2nd child thread in CPU 0
4th child thread in CPU 3
5th child thread in CPU 1
main thread in CPU 3
CPU的id号从0更改为3。我想知道为什么输出在0到3之间,而我的计算机只有2个内核和4个线程。输出中CPU的id是否等于物理线程的id?谢谢
您的计算机有2个核心和4个";逻辑处理器";(CPU(。因为您有4个CPU,所以ID号从0到3。
这里的主要问题是术语——;CPU";(和"线程"(。你假设";CPU";定义为";核心";,但大多数人将其定义为";逻辑处理器";或";(硬件(线程";;使用超线程,每个核心有2个逻辑处理器,因此最终有4个CPU(来自2个核心(。
我为pthread初学者准备的两分钱:
添加:
#包括<时间表h>
根据:https://man7.org/linux/man-pages/man3/sched_getcpu.3.html