Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 由进程停止或应用程序Nap触发的线程挂起检测器_C_Macos - Fatal编程技术网

C 由进程停止或应用程序Nap触发的线程挂起检测器

C 由进程停止或应用程序Nap触发的线程挂起检测器,c,macos,C,Macos,我编写了一个线程挂起检测器,当一些线程意外挂起时,它会打印一些调试输出(回溯等)。希望被监视的每个线程在挂起检测器系统中注册自己,指定一些超时(在我的例子中是5秒),并频繁调用一些iamalive()函数(在我的例子中大约每1-10ms一次) 它工作得很好。然而,在某些情况下,我会得到误报。例如,当ISIGSTOP停止进程并稍后恢复它时,它会被触发(例如,当附加了GDB/LLDB之类的调试器时)。而且也很少,当这个过程做的不多,只是空转时,我猜MacOSX的应用程序打盹开始了,它也会触发挂起检测

我编写了一个线程挂起检测器,当一些线程意外挂起时,它会打印一些调试输出(回溯等)。希望被监视的每个线程在挂起检测器系统中注册自己,指定一些超时(在我的例子中是5秒),并频繁调用一些
iamalive()
函数(在我的例子中大约每1-10ms一次)

它工作得很好。然而,在某些情况下,我会得到误报。例如,当I
SIGSTOP
停止进程并稍后恢复它时,它会被触发(例如,当附加了GDB/LLDB之类的调试器时)。而且也很少,当这个过程做的不多,只是空转时,我猜MacOSX的应用程序打盹开始了,它也会触发挂起检测器


如何检测此类系统挂起?查看处理器时间(
clock()
)并没有多大帮助,因为如果我的应用程序处于死锁状态,它可能也不会占用太多(如果有的话)处理器时间。

因此,实现可能有点复杂,但基本思想很简单:跟踪墙上的时钟时间并使用它来计算“宽限期”加上每个线程打电话回家可能会迟到的时间

使用类似于
gettimeofday()
()的方法记录观察线程首次启动的时间。每次它重新唤醒时,再次调用
gettimeofday()
,取差值,然后从中减去经过的“处理器时间”。这会给您一个大致的“宽限期”,您应该授予它,因为是您的流程没有运行的时候了

唯一次要的复杂化是因为需要为您正在监视的每个线程分别维护宽限期。因为您清楚地知道编写线程的能力,所以我假设该部分在您的能力范围内:-)