2014-02-22 61 views
0

觸發檢測器我已經寫了線程掛起檢測器,其打印一些調試輸出(回溯等)時一些線程意外掛起。每個想要觀看的線程都會在掛起檢測器系統中註冊自己,指定一些超時(在我的情況下爲5秒),並經常調用一些IAmAlife()函數(在我的情況下大約每1-10ms)。線程掛起通過過程停止或應用N ap個

它的偉大工程。但是,在某些情況下,我得到誤報。例如,當我在SIGSTOP這個進程中稍後恢復時,它會被觸發(例如,當用GDB/LLDB等調試器進行連接時)。而且很少,當這個過程沒有太多時,只是空轉,我猜MacOSX的App Nap會啓動,它也會觸發掛機檢測器。

我怎麼能檢測出這種系統掛起?查看處理器時間(clock())並沒有多大幫助,因爲如果我的應用程序處於死鎖狀態,它可能不會消耗太多(如果有的話)處理器時間。

回答

0

因此,實現可能有點複雜,但基本思想很簡單:跟蹤掛鐘時間並使用它來計算每個線程可以加入的「寬限期」晚打電話回家。

使用類似gettimeofday()http://linux.die.net/man/2/gettimeofday)來記錄時間第一次啓動您的守望者線程時。每次它重新醒來,再次撥打gettimeofday(),走差異化,然後從減去的「處理器時間」量經過。這給了你應該授予的粗糙的「寬限期」,因爲你的過程沒有運行。

唯一的小復化的出現是因爲寬限期需要爲每個正在觀看的線程單獨維護。既然你清楚地知道寫線程,我會假設這部分是你的能力:-)。