2012-03-12 92 views
2

在多線程編程中,如果某個工作線程意外退出並且主線程需要知道該線程是否存活,該怎麼辦?如何監視意外退出的線程?

有什麼辦法可以檢查嗎?

我想知道是否有當工人線程退出是由一個典型的信號。

(Linux)的

謝謝

+0

的可能重複[你怎麼查詢並行線程,看它是否仍在運行?](http://stackoverflow.com/questions/2156353/how-do-you-query-a-pthread-to-see如果它仍然在運行) – 2012-03-12 04:44:30

+0

那麼..使用標誌似乎沒用,因爲我一直在談論「意外退出」......如果它退出很好,我可以使用這些方法謝謝。在我寫這個之前閱讀那些問題:D – 2012-03-12 06:59:46

+0

圍繞每個線程體有一個很大的'try ... catch'嗎?你可以捕捉任何拋出的錯誤,並使用'cout << ex.what()<< endl;' – 2012-03-12 07:14:40

回答

2

如果線程意外地在你的程序死亡,這是烤麪包。如果您希望故障隔離和恢復,請使用多個進程(使用共享內存),而不是或者加入線程。在POSIX(也是Win32)上,您可以檢測進程共享互斥量的擁有者是否在持有該互斥量時死亡,並對共享數據執行一些「fsck-like」檢查和修復以嘗試恢復其不變量。 (很顯然,如果數據結構設計時考慮了可恢復事務,它可以幫助您。)在Win32上,您可以使用Windows結構化異常處理(SEH)捕獲線程中的任何異常。 (例如訪問衝突,除以零,...)。使用工具幫助API,你可以得到附加的模塊列表,並有接口讀取機器寄存器,錯誤地址等

在POSIX,你可以做到這一點與信號處理。訪問違規等事件將信號傳遞到它們所屬的線程。

這似乎並不現實,以這些作品編寫成是試圖保持一個有錯誤的程序運行恢復策略。

+0

嗯仍然沒有得到大圖片雖然大聲笑 我已經想通過發送pthread_kill(threadId,0),你可以檢查線程的活力(不會真的殺死它)。現在我想知道如何釋放意外死線的資源..我想我可以用pthread_create_key來做到這一點...仍然在尋找方法 – 2012-03-12 06:57:45