如何确定分离的pthread是否还活着?
我有一个与线程的通信通道(从线程向外指向的单向队列)但是如果线程在没有喘息的情况下死亡会发生什么?
我应该让自己使用过程信号,还是可以以某种方式探测线程的活力?
Pab*_*ruz 19
对于可连接(即非分离)pthread,您可以像这样使用pthread_kill:
int ret = pthread_kill(YOUR_PTHREAD_ID, 0);
Run Code Online (Sandbox Code Playgroud)
如果您获得ESRCH值,则可能是您的线程已死亡.
但是这不适用于分离的pthread,因为在它结束后,它的线程ID可以重用于另一个线程.
来自评论:
答案是错误的,因为如果线程被分离并且不活动,则pthread_t无效.你不能将它传递给pthread_kill.例如,它可以是指向已释放的结构的指针,从而导致程序崩溃.POSIX说:"符合条件的实现在其生命周期结束后可以自由地重用一个线程ID.如果一个应用程序试图使用其生命周期结束的线程ID,那么行为是未定义的." - 谢谢@DavidSchwartz
这个问题假定设计具有不可避免的竞争条件.
据推测,你打算做这样的事情:
问题是这个序列不是原子的,不能修复.具体来说,如果您检查的主题在步骤(1)和步骤(2)之间死亡怎么办?
种族条件是邪恶的; 罕见的种族条件加倍.使用99.999%可靠的东西来确定90%可靠的东西是您可以做出的最糟糕的决定之一.
你的问题的正确答案是"不要那样做".相反,修复您的应用程序,以便线程不会随机死亡.
如果这是不可能的,并且某些线程容易崩溃,并且您需要从中恢复......那么您的设计存在根本缺陷,您不应该使用线程.把那个不可靠的东西放在一个不同的过程中,并使用管道来代替它.进程死亡关闭文件描述符,并且读取另一端已关闭的管道具有定义明确,易于检测到的无竞争行为.
小智 5
当您向已经死亡的线程发送信号时,它可能是未定义的行为.您的应用可能会崩溃.请参阅http://sourceware.org/bugzilla/show_bug.cgi?id=4509和http://udrepper.livejournal.com/16844.html