为什么pthread_self()多次返回相同的id?

Tud*_*los 3 linux multithreading posix pthreads

我试图在for循环中创建一些线程(代表人),并显示作为参数传递的person id以及线程id.人员ID显示为已执行,但线程ID始终相同.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void* travelers(void* arg) {
    int* person_id = (int*) arg;
    printf("\nPerson %d was created, TID = %d", *person_id, pthread_self());
}

int main(int argc, char** argv)
{
    int i;
    pthread_t th[1000];

    for (i=0; i < 10; i++) {
        if ((pthread_create(&th[i], NULL, travelers, &i)) != 0) {
            perror("Could not create threads");
            exit(2);
        }
        else {
            // Join thread
            pthread_join(th[i], NULL);
        }
    }
    printf("\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是这样的:

Person 0 was created, TID = 881035008
Person 1 was created, TID = 881035008
Person 2 was created, TID = 881035008
Person 3 was created, TID = 881035008
Person 4 was created, TID = 881035008
Person 5 was created, TID = 881035008
Person 6 was created, TID = 881035008
Person 7 was created, TID = 881035008
Person 8 was created, TID = 881035008
Person 9 was created, TID = 881035008
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ulr*_*rdt 8

由于每次只创建一个创建的线程,每个新线程都会获得与之前完成的ID相同的ID,即ID只是被重用.尝试在循环中创建线程,然后在第二个循环中连接它们.

但是,您必须注意每个线程独立地读取内容i,这会给您带来不同的麻烦.我将索引作为上下文参数传递,然后将其转换为线程函数内的int.