【问题标题】:Situations when `pthread_join` can fail / not invoked and cause zombie threads`pthread_join` 可能失败/未调用并导致僵尸线程的情况
【发布时间】:2013-05-08 15:55:04
【问题描述】:

发件人:http://man7.org/linux/man-pages/man3/pthread_join.3.html

无法与可连接的线程(即未分离的线程)连接,会产生“僵尸线程”。避免这样做,...

我怎样才能避免这样做?我不明白,因为当我尝试加入一个线程时,为什么我会故意要失败?

【问题讨论】:

  • 您可以通过不这样做来避免这种情况。
  • 加入失败...”表示“未调用pthread_join() ...”。
  • 也见this链接
  • 应该说忽略加入。 “失败”在计算中超载。

标签: c pthreads


【解决方案1】:

我想手册页的意思是,如果您的应用程序在终止后没有加入可连接线程,而只是忘记了它,那么终止的线程就会变成僵尸线程,僵尸是坏的。

也就是说,失败这里的意思是故意不执行

【讨论】:

  • 那么加入是更好还是最好的事情?为什么我要加入已终止的线程。我的意思是为什么需要它?
  • 加入一个终止的线程会释放这个终止线程分配的系统资源(当线程终止时,系统仍然保持退出状态,我猜线程id和其他线程相关的数据也被保留了)直到“加入”。)将pthread_join 视为破坏线程对象。不加入会导致系统资源泄露。
【解决方案2】:
 Failure to join with a thread that is joinable (i.e., one that is not
 detached), produces a "zombie thread".  Avoid doing this 

这表明您应该确保处理所有可能导致pthread_join 未被线程调用的情况。 (并导致僵尸)

进一步指出,

   There is no pthreads analog of waitpid(-1, &status, 0), that is,
   "join with any terminated thread".

请在此处查看waitpid。还有这个link

您没有任何功能,例如要检查进程的情况,因此最好通过正确处理代码中的情况来避免错过对 pthread_join 的调用。

【讨论】:

  • 你能用一些代码的例子来解释一下吗?我无法理解“您应该确保处理所有可能导致线程不调用 pthread_join 的情况。(并导致僵尸)”是什么意思
【解决方案3】:

为了避免创建“僵尸线程” 你需要做这些事情:

  1. 不要使用分离的线程。
  2. 确保您在线程例程中的正确位置有 cancel_point。
  3. 确保您的线程例程具有退出代码。

https://computing.llnl.gov/tutorials/pthreads/

【讨论】:

    【解决方案4】:

    避免僵尸的最简单方法是使用分离线程功能。在线程入口函数中调用pthread_detach(pthread_self()),或者在创建线程时调用thid = pthread_create(...); pthread_detach(thid)

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 2018-06-06
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多