2013-05-08 25 views
1

来自:http://man7.org/linux/man-pages/man3/pthread_join.3.html情况时`pthread_join`可以失败/不被调用并且导致僵尸线程

衰竭的线程是可连接(即,一个没有被分离的),产生“僵尸线程”加入。避免这样做,...

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

+2

*您可以通过*不这样做* – 2013-05-08 15:58:21

+1

“*未能加入... *”意思是“*不会调用'pthread_join()'... *”。 – alk 2013-05-08 15:59:02

+0

请看[this](http://stackoverflow.com/questions/10870599/does-pthread-join-failure-cause-child-process-to-be-zombies)链接 – 2013-05-08 16:03:07

回答

0

我想手册页意味着如果您的应用程序在终止后未加入可连接的线程,但只是忘记了它,则终止的线程变成僵尸线程,而僵尸是不好的。

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

+0

那么加入一个更好或最好的事情呢?为什么我想要加入已终止的线程。我的意思是为什么它是必需的? – abc 2013-05-08 16:07:08

+1

加入已终止的线程会释放由已终止的线程分配的系统资源(当线程终止时,系统仍然保持退出状态,并且我认为线程ID和其他线程相关的数据也会一直保留到'join')。 'pthread_join'作为破坏线程对象。未加入会导致系统资源泄漏。 – Inspired 2013-05-08 16:17:03

0
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通话。

+0

你能解释一些代码的例子吗?我不明白你的意思是什么,你应该确保你处理所有可能导致pthread_join不被调用的线程。(并导致僵尸)“ – abc 2013-05-08 18:50:58

0

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

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

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

0

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