根据手册页:
pthread_join()函数应暂停执行调用 线程直到目标线程终止,除非是目标线程 已经终止了。
因此,据我所知,调用进程将阻塞,直到指定的线程退出。
现在考虑以下代码:
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]
的返回值?
答案 0 :(得分:4)
但是,如果另一个线程,如果我们被阻止,说[2]退出 调用pthread_join(thrs [0],NULL)?
是的,它可能会发生。在这种情况下,pthread_join(thrs[2], NULL);
将立即返回。
我们是否必须等待[0]退出才能收到退货 价值[2]?
是的,您必须等待thr[0]
终止。
(与问题没有直接关系)
没有必要在您创建的每个线程上调用pthread_join()
。从线程获取返回状态是一个方便的功能。如果您不需要知道线程的终止状态,您可以
通过发布“已分离”属性来创建线程,或者从线程本身调用pthread_detach(pthread_self());
以使其分离。
在某些情况下,您希望创建的线程继续执行但不再需要 main 线程。在这种情况下,您可以从主线程调用pthread_exit(NULL);
,即使在主线程退出后也会让其他线程继续。
答案 1 :(得分:3)
是的 - thrs[0]
上阻止的主要帖子在thrs[2]
和thrs[[0]
退出后才会从thrs[1]
获得结果。
如果你需要更多的灵活性,一个选择是做一些事情,比如让线程将结果发布在队列中,或者以线程需要连接的其他方式发出信号。主线程可以监视该队列/信号并获得必要的结果(可能来自pthread_join()
,该线程在已知从队列/信号中的信息完成的线程上完成。
答案 2 :(得分:1)
是。代码是串行执行的。