多个线程如何具有相同的线程ID?

时间:2017-09-28 12:38:34

标签: c multithreading ubuntu unix process

我有一个问题:多个线程可以拥有相同的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

1 个答案:

答案 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);
}