根据手册页:



因此,据我了解,调用过程将一直阻塞直到指定的线程退出。

现在考虑以下代码:

pthread_t thrs[NUMTHREADS];

for (int i = 0; i < NUMTHREADS; i++)
{
    pthread_create(&thrs[i], NULL, thread_main, NULL);
}

pthread_join(thrs[0], NULL); /* will be blocked here */
pthread_join(thrs[1], NULL);
pthread_join(thrs[2], NULL);
/* ... */
pthread_join(thrs[NUMTHREADS - 1], NULL);

调用线程将在对pthread_join(thrs[0], NULL)的调用中被阻止,直到thrs[0]以某种方式退出。但是,如果另一个线程(例如thrs[2])在调用pthread_exit()的过程中被阻塞时又调用pthread_join(thrs[0], NULL)呢?为了接收thrs[0]的返回值,我们是否必须等待thrs[2]退出?

最佳答案

是的-在thrs[0]thrs[2]也退出之前,在thrs[[0]上阻塞的主线程将不会从thrs[1]获得结果。

如果需要更大的灵活性,一种选择是执行一些操作,例如让线程将结果发布到队列中或以其他方式发出信号,要求线程被加入。主线程可以监视该队列/信号并获得必要的结果(可能来自在线程上完成的pthread_join(),已知该信息是从队列/信号中完成的)。

10-06 03:02