如何确定分离的pthread是否仍 alive ?
我有一个与线程的通信通道(从线程向外指向的单向队列)但是如果线程在没有喘息的情况下死亡会发生什么?
我是否应该让自己使用进程信号,或者我可以探测以获得线程活力吗?
答案 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)之间死亡怎么办?
种族条件是邪恶的;罕见的种族条件加倍。使用99.999%可靠的东西写出90%可靠的东西是你可以做出的最糟糕的决定之一。
你的问题的正确答案是“不要那样做”。相反,修复您的应用程序,以便线程不会随机死亡。
如果这是不可能的,并且某些线程容易崩溃,并且您需要从中恢复......那么您的设计存在根本缺陷,您不应该使用线程。将不可靠的东西放在不同的进程中,并使用管道来代替它进行通信。进程死亡关闭文件描述符,并且读取另一端已关闭的管道具有定义明确,易于检测到的无竞争行为。
答案 2 :(得分:5)
当您向已经死亡的线程发送信号时,可能是未定义的行为。您的应用可能会崩溃。 请参阅http://sourceware.org/bugzilla/show_bug.cgi?id=4509和http://udrepper.livejournal.com/16844.html