Linux 如何确定分离的pthread是否处于活动状态?

Linux 如何确定分离的pthread是否处于活动状态?,linux,pthreads,Linux,Pthreads,如何确定分离的pthread是否仍处于活动状态 我有一个与线程的通信通道(一个从线程向外指向的单向队列),但是如果线程没有喘息就死掉了会发生什么呢 我应该放弃使用进程信号,还是可以以某种方式探测线程的活跃性?对于可连接(即未分离)的pthread,您可以这样使用: int ret = pthread_kill(YOUR_PTHREAD_ID, 0); 如果得到一个ESRCH值,则可能是线程已死亡 但是,这不适用于分离的pthreads,因为在它结束后,它的线程ID可以被另一个线程重用 从评论中

如何确定分离的pthread是否仍处于活动状态

我有一个与线程的通信通道(一个从线程向外指向的单向队列),但是如果线程没有喘息就死掉了会发生什么呢

我应该放弃使用进程信号,还是可以以某种方式探测线程的活跃性?

对于可连接(即未分离)的pthread,您可以这样使用:

int ret = pthread_kill(YOUR_PTHREAD_ID, 0);
如果得到一个ESRCH值,则可能是线程已死亡

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

从评论中:

答案是错误的,因为如果线程是分离的,而不是 活动时,pthread\u t无效。不能将其传递给pthread\u kill。信息技术 例如,可以是指向已释放结构的指针, 导致程序崩溃。POSIX说,“一个 在线程ID的生命周期结束后,实现可以自由地重用线程ID 如果应用程序试图使用其生存期为 已经结束,行为未定义。”–谢谢@DavidSchwartz


当您向已经死掉的线程发送信号时,这可能是未定义的行为。您的应用程序可能会崩溃。
请参见和

此问题假设设计具有不可避免的竞争条件

大概你打算做这样的事情:

int ret = pthread_kill(YOUR_PTHREAD_ID, 0);
  • 检查线程是否处于活动状态
  • 等待来自线程的消息
  • 问题是,这个序列不是原子序列,无法修复。具体来说,如果您正在检查的线程在步骤(1)和步骤(2)之间死亡,该怎么办

    种族环境是邪恶的;罕见的种族条件更是如此。用99.999%的可靠性来掩饰90%的可靠性是你能做出的最糟糕的决定之一

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


    如果这是不可能的,并且一些线程容易崩溃,那么您需要从中恢复。。。那么你的设计根本上是有缺陷的,你不应该使用线程。把那个不可靠的东西放在另一个进程中,用管道与之通信。Process death关闭文件描述符,读取另一端已关闭的管道具有定义良好、易于检测的无争用行为。

    问题在于
    您的线程ID
    自分离以来,可能已被另一个线程回收。所以应该是这样的:如果你得到ESRCH,你的线程就死了,否则你不能确定(除非你知道新创建线程的ID)。@RedGlyph:这是一个非常典型的标识符回收难题。在我的情况下,我愿意接受它发生冲突的可能性很小,因为我将以合理的频率进行轮询。如果您的线程是可连接的,则在它与
    pthread\u join
    连接之前,实现无法重用线程id。因为问题表明它是一个分离的线程,它的终止将释放资源,此后线程id将不再有效。正如karsten所说,对该线程id调用pthread_kill将导致未定义的行为。如果线程id被回收,这不仅仅是一个问题;如果传递了无效的线程id,程序可能会崩溃或执行任何其他操作。因此,此答案不仅不正确,而且很危险。@PabloSantaCruz您无法删除已接受的答案。答案是错误的,因为如果线程已分离且不活动,则
    pthread\u t
    无效。您不能将其传递给
    pthread\u kill
    。例如,它可能是指向已释放结构的指针,导致程序崩溃,“一致性实现在其生存期结束后可以自由重用线程ID。如果应用程序尝试使用其生存期结束的线程ID,则行为未定义。”问题源于关闭过程,而不是崩溃恢复过程。