【问题标题】:Zombie Threads on POSIX systemsPOSIX 系统上的僵尸线程
【发布时间】:2011-08-08 15:31:35
【问题描述】:

僵尸线程在 C/C++ 中是如何形成的,为了防止它们被创建,您需要确保做什么?我知道它们只是没有正确终止的普通线程,但我对细节有点模糊。

【问题讨论】:

    标签: multithreading posix


    【解决方案1】:

    僵尸线程是一个已终止的可连接线程,但它 尚未加入。通常,任何一个线程都应该在某个位置加入 时间,或者它应该被分离。否则,操作系统保持其状态 对于一些可能的未来加入,这需要资源。

    【讨论】:

    • 添加到答案中,一个终止的线程必须被另一个线程加入才能被回收,而一个分离的线程必须被显式取消(pthread_cancel)或退出(pthread_exit)才能被回收。
    • @ArnuMu pthread 在它调用的函数返回时自动退出。 (我不记得曾经使用过pthread_exit。而pthread_cancel 可能很棘手,并且不能保证线程会终止。
    • 关于线程在返回时自动退出是正确的。我使用它(取决于心情:))。但我不同意你关于“pthread_cancel”不可靠性的评论。你能提供一些链接作为证据吗?
    • 我发现了这个不错的链接:mkssoftware.com/docs/man3/pthread_cancel.3.asp
    • @ArunMu Posix 标准。 pthread_cancel 请求取消,它不会强制取消。取消只能发生在代码中的特定位置;它可以被pthread_cancel_state 阻塞,或者在某些系统请求中,它调用清理处理程序,这些处理程序不一定会完成(并且取消只会在它们完成后终止线程)。终止线程是一个复杂的问题,有时pthread_cancel 是必要的,但永远不够;线程必须合作。
    【解决方案2】:

    您是指 pthread 还是僵尸进程?当父进程没有收获它的子进程时,就会创建一个僵尸进程(不是线程)。这是因为如果父级以后需要它,操作系统会保留进程的返回状态。如果父母死了,孩子会被交给初始化线程,它只是坐在那里一遍又一遍地调用“等待”(收获任何死去的孩子)。所以只有当父进程还活着,子进程已经终止时,才能创建僵尸进程。

    这同样适用于 pthread。如果您分离线程,它不会在它完成后保持该进程终止状态(类似于进程)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 2011-04-22
      • 2011-03-14
      • 2015-01-15
      • 1970-01-01
      相关资源
      最近更新 更多