【发布时间】:2015-10-20 19:20:06
【问题描述】:
我的程序中的流程调用pthread_join(thread_id, nullptr);
来自同一个调用线程的相同thread_id 2 次。
第一次调用成功返回,但第二次无限期挂起。文档没有明确说明禁止为同一个thread_id多次调用pthread_join。真的是这样吗?
我知道我可以使用 pthread_cond_t 实现线程同步,但我想先了解 pthread_join 的限制。
【问题讨论】:
-
这没有意义:
pthread_join在加入的线程结束时返回。一个线程不能多次结束...另外:man page 声明:加入之前已加入的线程会导致未定义的行为。 -
文档明确指出“如果该线程已经终止,则 pthread_join() 立即返回”。因此,如果程序的不同部分有兴趣检查他们的子进程是否结束,这确实是有意义的。
-
@Roman:“已经终止但尚未加入”和“已经加入”是完全不同的东西。 任何在
pthread_join之后使用pthread_t都是极其危险的未定义行为(这是一个use-after-free 类型的错误)。 -
我使用 join 作为同步机制来确保后台任务已经完成,我需要从程序中的多个点进行检查。我想使用 join 进行同步在概念上是错误的。虽然不确定它的正确用例是什么....
-
一次 join() 是一次太多:(