为什么 pthread_join 不阻塞并等待线程完成?

Why pthread_join does not block and wait for the thread to finish?

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

void* thread(void *v) {
    printf("The thread starts now\n");
    //pthread_exit(NULL);
}

int main() {
    int tid1;
    int retValue = 0;
    pthread_create(&tid1, NULL,thread, NULL);

    retValue = pthread_join(tid1, NULL);
    printf("Thread ID: %d, return value: %d\n",tid1, retValue);

    retValue = pthread_join(tid1, NULL);
    printf("Thread ID: %d, return value: %d\n",tid1, retValue);
    return 0;
}

有时输出是:

Thread ID: 1877241856, return value: 3
Thread ID: 1877241856, return value: 3
The thread starts now

Process finished with exit code 0

问题是:

  1. 根据定义,pthread_join应该阻塞,等待thread执行完毕,再执行后面的代码。但为什么在我的代码中,thread 在两个 pthread_join 完成后运行?

  2. 根据定义,pthread_join returns 0表示加入成功,但是为什么我代码的retValue总是3,是否threadpthread_join 函数之前或之后运行?

此代码中存在许多错误:

  1. pthread_create() 的第一个参数应该是 pthread_t,而不是 int。它们的大小很可能不同,或者可以互换,因此 tid1 可能不是有效的 pthread id。

  2. 线程不 return 0,或与此相关的任何其他值。没有 return 声明。

  3. “成功时,pthread_join() returns 0;错误时,returns 是一个错误号。” 线程的 return 值(如果有的话)将被放入 pthread_join() 的未使用的第二个参数中。被视为 return 值的实际上是 pthread_join() 调用本身的结果。这是一个错误。也许与上面的#1 有关?

除了 TrentP 发现的那些之外,最严重的错误是

Joining with a thread that has previously been joined results in undefined behavior.

即在同一线程上调用 pthread_join 两次

retValue = pthread_join(tid1, NULL);
retValue = pthread_join(tid1, NULL);

是完全错误的,说如果将 tid1 更改为 pthread_t 就有效是错误的。未定义的行为意味着第二次调用 pthread_join 时可能发生任何事情 - pthread_join 可以 return 出错,pthread_join 可以 return 成功,它可以崩溃,它可以挂起,它可以修改内存的其他部分,它可以导致启动一个新线程...