如何确定分离的pthread是否还活着?

时间:2009-11-07 14:21:50

标签: linux pthreads

如何确定分离的pthread是否仍 alive

我有一个与线程的通信通道(从线程向外指向的单向队列)但是如果线程在没有喘息的情况下死亡会发生什么?

我是否应该让自己使用进程信号,或者我可以探测以获得线程活力吗?

3 个答案:

答案 0 :(得分:19)

对于可连接(即非分离)pthread,您可以使用pthread_kill,如下所示:

int ret = pthread_kill(YOUR_PTHREAD_ID, 0);

如果您获得 ESRCH 值,则可能是您的帖子已经死亡。

但是这不适用于分离的pthreads,因为在它结束后,它的线程ID可以重用于另一个线程。

来自评论:

  

答案是错误的,因为如果线程是分离的而不是   活着,pthread_t无效。你不能将它传递给pthread_kill。它   例如,可以是指向已释放的结构的指针,   导致程序崩溃。 POSIX说:“符合标准   实现可以在生命周期之后自由地重用线程ID   结束。如果应用程序尝试使用其生命周期的线程ID   已经结束,行为未定义。“ - 谢谢@DavidSchwartz

答案 1 :(得分:9)

这个问题假定设计具有不可避免的竞争条件。

据推测,你打算做这样的事情:

  1. 检查线程是否存活
  2. 等待来自帖子的消息
  3. 问题是这个序列不是原子的,不能修复。具体来说,如果您检查的主题在步骤(1)和步骤(2)之间死亡怎么办?

    种族条件是邪恶的;罕见的种族条件加倍。使用99.999%可靠的东西写出90%可靠的东西是你可以做出的最糟糕的决定之一。

    你的问题的正确答案是“不要那样做”。相反,修复您的应用程序,以便线程不会随机死亡。

    如果这是不可能的,并且某些线程容易崩溃,并且您需要从中恢复......那么您的设计存在根本缺陷,您不应该使用线程。将不可靠的东西放在不同的进程中,并使用管道来代替它进行通信。进程死亡关闭文件描述符,并且读取另一端已关闭的管道具有定义明确,易于检测到的无竞争行为。

答案 2 :(得分:5)

当您向已经死亡的线程发送信号时,可能是未定义的行为。您的应用可能会崩溃。 请参阅http://sourceware.org/bugzilla/show_bug.cgi?id=4509http://udrepper.livejournal.com/16844.html