2009-11-07 152 views
23

如何確定分離的pthread是否仍然存在如何確定pthread是否存活?

我有一個與線程通信的通道(一個單向隊列從線程向外指向),但是如果線程沒有喘氣就死了會發生什麼?

,我就辭職自己使用過程信號還是可以的我探頭線程生動活潑不知何故?

回答

19

您可以使用pthread_kill這樣的:

int ret = pthread_kill(YOUR_PTHREAD_ID, 0); 

如果你得到一個ESRCH值,它可能是你的線程是死的情況。

更新:顯然,我的回答是錯誤的。我無法刪除它,因爲這是一個被接受的答案。

從評論:

The answer is wrong because if the thread is detached and is not alive, the pthread_t is invalid. You can't pass it to pthread_kill. It could, for example, be a pointer to a structure that was freed, causing your program to crash. POSIX says, "A conforming implementation is free to reuse a thread ID after its lifetime has ended. If an application attempts to use a thread ID whose lifetime has ended, the behavior is undefined." – Thanks @DavidSchwartz

+0

短而甜蜜......謝謝! – jldupont 2009-11-07 14:48:17

+5

與之相關的問題是'YOUR_PTHREAD_ID'可能在分離後的同一時間被另一個線程回收。所以它應該是:__如果你得到ESRCH,你的線程已經死了,否則你不能確定_(除非你知道新創建的線程的ID)。 – RedGlyph 2009-11-07 14:53:04

+0

@RedGlyph:這是一個非常典型的標識符回收難題。就我而言,我願意接受它發生的小概率碰撞,因爲我會以合理的頻率進行投票。 – jldupont 2009-11-07 15:03:14

9

此問題假定具有不可避免的競爭條件的設計。

想必,你打算做這樣的事情:

  1. 檢查,看是否線程處於活動狀態
  2. 等待消息從螺紋

的問題是,這個序列不是原子並且不能修復。具體來說,如果您正在檢查的線程在步驟(1)和步驟(2)之間死了怎麼辦?

種族條件惡劣;罕見的比賽條件倍增。 90%以上的可靠性和99.999%的可靠性是可以做出的最糟糕的決策之一。

您的問題的正確答案是「不要那樣做」。相反,修復您的應用程序,以便線程不會隨機死亡。

如果這是不可能的,並且某個線程容易崩潰,並且您需要從中恢復......那麼您的設計基本上存在缺陷,並且您不應該使用線程。將不可靠的東西放在不同的進程中,並使用管道來代替。進程死亡關閉文件描述符,並且讀取其另一端已關閉的管道已定義明確,容易檢測到的無競爭行爲。

+0

該問題源於關機程序,而不是崩潰恢復程序。 – jldupont 2012-01-17 19:08:27