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

jld*_*ont 24 linux pthreads

如何确定分离的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

  • 如果你的线程是可连接的,那么实现之前不能重用线程id**,直到它与`pthread_join`连接. (8认同)
  • 这个问题是`YOUR_PTHREAD_ID`可能在分离后的同一时间内被另一个线程回收.所以它应该是:__如果你得到ESRCH,你的线程已经死了,否则你无法确定_(除非你知道新创建的线程的ID). (5认同)
  • @PabloSantaCruz您无法删除已接受的答案.答案是错误的,因为如果线程被分离并且不活动,则`pthread_t`无效.你不能把它传递给`pthread_kill`.例如,它可以是指向已释放的结构的指针,从而导致程序崩溃.[POSIX说](http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_02),"*A一致的实现可以自由地重用其寿命已经结束之后的线程ID.如果应用程序试图要使用其生命周期已结束的线程ID,行为是未定义的.*" (3认同)
  • 因为问题表明它是一个分离的线程,它的终止将释放资源,之后线程id将不再有效.正如karsten所说,在该线程id上调用pthread_kill会导致未定义的行为.如果线程id被回收,这不仅仅是一个问题; 如果传递了无效的线程ID,程序可能会崩溃或执行任何其他操作.所以这个答案不仅不正确而且危险. (2认同)

Nem*_*emo 8

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

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

  1. 检查线程是否存活
  2. 等待来自线程的消息

问题是这个序列不是原子的,不能修复.具体来说,如果您检查的主题在步骤(1)和步骤(2)之间死亡怎么办?

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

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

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


小智 5

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