我已经编写了一个线程挂起检测器,它打印一些调试输出(回溯等)。当某个线程意外挂起时。每个想要被监视的线程在挂起检测器系统中注册自己,指定一些超时(在我的例子中是5秒),并频繁地调用一些IAmAlife()函数(在我的例子中大约每隔1-10ms)。
它工作得很好。然而,在某些情况下,我得到的是假阳性。例如,当我SIGSTOP进程并稍后恢复它时,它会被触发(例如,当连接到像GDB/LLDB这样的调试器时)。而且,当进程不做太多事情,只是空闲时,我猜MacOSX的App Nap会启动,它也会触发挂起检测器。
我怎么能检测到这样的系统挂起?查看处理器时间(clock())不会有太大帮助,因为如果我的应用程序处于死锁状态,它可能也不会消耗太多(如果有的话)处理器时间。
发布于 2014-02-23 00:17:01
因此,实现可能有点复杂,但基本思想很简单:跟踪挂钟时间,并使用它来计算一个“宽限期”,以添加到每个线程可以晚打电话回家的时间量。
使用诸如gettimeofday() (http://linux.die.net/man/2/gettimeofday)之类的命令来记录监视器线程第一次启动的时间。每次它重新唤醒时,再次调用gettimeofday(),取差值,然后从该差值中减去所用的“处理器时间”。这给了您应该授予的粗略的“宽限期”,因为此时您的进程并未运行。
唯一的小复杂性出现是因为需要为您正在观察的每个线程单独维护宽限期。既然您对编写线程有足够的了解,那么我就假设这部分在您的能力范围之内:-)。
https://stackoverflow.com/questions/21955973
复制相似问题