[英]How to detect if a linux thread is crashed
我遇到了这个问题,我需要了解 Linux 线程是否由于崩溃而不是正常退出而正在运行。 这样做的原因是尝试在不重置\重新启动所有系统的情况下重新启动线程。 pthread_join() 似乎不是一个好的选择,因为我有几个线程要监视,而 function 在特定线程上返回,它在“并行”中不起作用。 目前我有一个从线程到主线程的实时信号,但我正在寻找一些系统调用或线程属性来理解 state 有什么建议吗?
P
如何检测linux线程是否崩溃
if (0) //...
也就是说,pthreads 线程可以异常终止而进程中的其他线程继续运行的唯一方法是通过线程取消, *这不能很好地描述为“崩溃”。 特别是,如果接收到一个信号,其效果是异常终止,那么整个进程都会终止,而不仅仅是处理该信号的线程。 其他类型的错误不会导致线程终止。
另一方面,如果“崩溃”是指响应线程检测到错误情况的正常终止,那么您对线程在终止之前可以做什么并就其 state 进行通信没有任何限制。例如,
如果愿意,您可以使用pthread_cleanup_push()
来注册线程清理处理程序来帮助解决这个问题。
另一方面,如果您询问如何检测无法取得进展的活动线程——例如,因为它们处于死锁状态——那么您最好的选择可能是实现某种形式的心跳监视器。 这将涉及您要监视的每个线程定期更新一个共享的 object,它跟踪每个线程的上次更新时间。 如果一个线程在节拍之间的时间太长,那么您可以猜测它可能被停滞了。 这需要您检测所有要监视的线程。
您不应该使用线程取消。 但是,如果您这样做了,并且如果您在“崩溃”的定义中包括因取消而终止,那么您仍然可以使用上述所有选项,但您必须通过注册一个或多个清理处理程序来使用它们。
使用pthread_join()
检查线程 state 的主要问题是
pthread_join()
阻塞,直到指定的线程终止。 对于守护线程,您需要已经讨论过的方法之一,但对于 GNU/Linux 上的普通线程,Glibc 提供了非标准的pthread_tryjoin_np()
,它执行非阻塞尝试加入线程,还有pthread_timedjoin_np()
,它执行超时的加入尝试。 如果您愿意依赖 Glibc 特定的功能,那么其中一个可能会满足您的目的。
Linux kernel 通过/proc
文件系统提供每个进程的线程状态信息。 请参阅如何检查 Linux 线程的 state? , 例如。 但是请注意,每个 kernel 版本的细节略有不同。 如果您打算经常这样做,那么还要注意即使/proc
是一个虚拟文件系统(因此不涉及物理磁盘),您仍然可以通过慢速 I/O 接口访问它。
任何其他替代方案都可能比读取/proc
中的文件更好。 我提到它只是为了完整性。
我正在寻找一些系统调用或线程属性来理解 state
pthreads API 不提供“你终止了吗?” function 或任何其他此类状态查询 function,除非您算上pthread_join()
。 如果你想要那样,那么你需要自己动手,你可以通过已经讨论过的一些工具来做到这一点。
*不要使用线程取消。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.