Linux 如何确定分离的pthread是否处于活动状态?
如何确定分离的pthread是否仍处于活动状态 我有一个与线程的通信通道(一个从线程向外指向的单向队列),但是如果线程没有喘息就死掉了会发生什么呢 我应该放弃使用进程信号,还是可以以某种方式探测线程的活跃性?对于可连接(即未分离)的pthread,您可以这样使用:Linux 如何确定分离的pthread是否处于活动状态?,linux,pthreads,Linux,Pthreads,如何确定分离的pthread是否仍处于活动状态 我有一个与线程的通信通道(一个从线程向外指向的单向队列),但是如果线程没有喘息就死掉了会发生什么呢 我应该放弃使用进程信号,还是可以以某种方式探测线程的活跃性?对于可连接(即未分离)的pthread,您可以这样使用: int ret = pthread_kill(YOUR_PTHREAD_ID, 0); 如果得到一个ESRCH值,则可能是线程已死亡 但是,这不适用于分离的pthreads,因为在它结束后,它的线程ID可以被另一个线程重用 从评论中
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);
如果这是不可能的,并且一些线程容易崩溃,那么您需要从中恢复。。。那么你的设计根本上是有缺陷的,你不应该使用线程。把那个不可靠的东西放在另一个进程中,用管道与之通信。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,则行为未定义。”问题源于关闭过程,而不是崩溃恢复过程。