根据手册页:
因此,据我了解,调用过程将一直阻塞直到指定的线程退出。
现在考虑以下代码:
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()
,已知该信息是从队列/信号中完成的)。