【问题标题】:joining the same pthread multiple times多次加入同一个 pthread
【发布时间】: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() 是一次太多:(

标签: c linux pthreads posix


【解决方案1】:

查看documentation for pthread_join - 在注释部分中指出:

加入之前已加入的线程会导致未定义的行为。

链接中还有很多其他关于加入线程(以及其他方面,如果您搜索其他一些 pthread 函数)的好信息。

【讨论】:

  • 谢谢!我不敢相信我错过了那条线:(
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
相关资源
最近更新 更多