我有一个问题:多个线程可以拥有相同的thread_id吗? (当然不是。)但我的代码正在这样做。这怎么可能?
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/types.h>
void* message(void* var){
int t = (int)var;
printf("\n%d- Hi I'm thread ID=%lu\n",t+1,(int unsigned long)pthread_self());
}
int main(void){
pthread_t threads[10];
int report[10];
for(int i=0;i<10;i++){
report[i] = pthread_create(&threads[i],NULL,message,(void*)i);
pthread_join(threads[i],NULL);
}
return 0;
}
我在(Ubuntu 17.04)的代码显示了这个结果
1- Hi I'm thread ID=3076250432
2- Hi I'm thread ID=3076250432
3- Hi I'm thread ID=3076250432
4- Hi I'm thread ID=3076250432
5- Hi I'm thread ID=3076250432
6- Hi I'm thread ID=3076250432
7- Hi I'm thread ID=3076250432
8- Hi I'm thread ID=3076250432
9- Hi I'm thread ID=3076250432
10- Hi I'm thread ID=3076250432
答案 0 :(得分:4)
for(int i=0;i<10;i++){
report[i] = pthread_create(&threads[i],NULL,message,(void*)i);
pthread_join(threads[i],NULL);
}
您正在创建一个主题,然后立即加入它,等待它完成。这导致十个线程按顺序而不是并行创建,允许它们的ID被回收。
如果您在加入之前创建了所有十个主题,则会看到不同的ID。
for(int i=0;i<10;i++){
report[i] = pthread_create(&threads[i],NULL,message,(void*)i);
}
for(int i=0;i<10;i++){
pthread_join(threads[i],NULL);
}