我有这个问题,我需要了解Linux线程是否因崩溃而运行,而不是正常退出。这样做的原因是尝试重新启动线程而不重置\重新启动所有系统。pthread_join((似乎不是一个好的选择,因为我有几个线程要监视,函数在特定线程上返回,它在"中不起作用;平行";。目前,我有一个从线程到主线程的keeep实时信号,但我正在寻找一些系统调用或线程属性来了解状态有什么建议吗?
p
线程"崩溃">
如何检测linux线程是否崩溃
if (0) //...
也就是说,当进程中的其他线程继续运行时,pthreads线程可以异常终止的唯一方法是通过线程取消,*,这不是很好地描述为"线程";崩溃";。特别地,如果接收到一个信号,其效果是异常终止,那么整个过程终止,而不仅仅是处理该信号的线程。其他类型的错误不会导致线程终止。
另一方面,如果通过";崩溃";你的意思是正常终止以响应线程检测到错误条件,那么你对线程在终止之前可以做什么来传达其状态没有限制。例如,
- 它可以更新一个跟踪线程信息的共享对象
- 它可以写入指定用于此目的的管道
- 它可以发出信号
如果您愿意,可以使用pthread_cleanup_push()
来注册线程清理处理程序以帮助实现这一点。
第三方面,如果你想检测那些无法取得进展的活动线程——例如,因为它们处于死锁状态——那么你最好的选择可能是实现某种形式的心跳监视器。这将涉及到要监视的每个线程定期更新一个共享对象,该对象跟踪每个线程上次更新的时间。如果一个线程在节拍之间过长,那么你可以猜测它可能会停滞。这需要对所有要监视的线程进行检测。
线程取消
您不应该使用线程取消。但如果你这样做了,并且如果你在你对";崩溃";,那么您仍然可以使用上面的所有选项,但必须通过注册一个或多个清理处理程序来使用它们。
GNU特定选项
使用pthread_join()
检查线程状态的主要问题是
- 它不适用于守护进程线程,并且
pthread_join()
阻塞,直到指定的线程终止
对于守护进程线程,您需要已经讨论过的方法之一,但对于GNU/Linux上的普通线程,Glibc提供了非标准的pthread_tryjoin_np()
,它执行加入线程的非阻塞尝试,还有pthread_timedjoin_np()
,它执行带超时的加入尝试。如果你愿意依赖Glibc特定的功能,那么其中一个可能会达到你的目的。
Linux特定选项
Linux内核通过/proc
文件系统提供每个进程的线程状态信息。请参阅如何检查Linux线程的状态?,例如但是,请注意,不同的内核版本的细节会有所不同。如果您计划经常这样做,那么也要注意,即使/proc
是一个虚拟文件系统(因此不涉及物理磁盘(,您仍然可以通过缓慢的I/O接口访问它。
任何其他备选方案都可能比在/proc
中读取文件要好。我提到它只是为了完整。
总体
我正在寻找一些系统调用或线程属性来了解状态
pthreads API不提供";你终止合同了吗"函数或任何其他此类状态查询函数,除非您计算pthread_join()
。如果你想这样做,那么你需要自己滚动,你可以通过已经讨论过的一些设施来做到这一点。
*不要使用线程取消。