2010-04-13 26 views
0

我有一個單獨的線程ListenerThread,它有一個套接字監聽由某個遠程服務器廣播的信息。這是在我需要開發的一個類的構造函數中創建的。查殺具有套接字的單獨線程

由於要求,一旦單獨的線程啓動,我需要避免主線程上的任何阻塞函數。 一旦涉及到調用我的類的析構函數的時候,我不能在偵聽器線程上執行聯接,因此我唯一能做的就是殺死它。

我的問題是:

  1. 會發生什麼由傳遞給THEAD功能分配網絡resoruces?套接字是否正確關閉,或者可能有未決事項? (最擔心這個)

  2. 這個過程是否足夠快,即線程是否被殺死,以便立即中斷?

  3. 我使用Linux ...我可以檢查什麼命令或者什麼,以確保沒有網絡資源的未決或出現了錯誤的操作系統

我非常感謝你太多的幫助

問候 MNSTN

注意:我使用boost ::線程C++

回答

2
  1. 網絡資源屬於進程,而不是線程,因此套接字仍處於打開狀態。

  2. boost::thread沒有 kill方法。你只能 中斷它。效果不是立即執行且取決於OS 調度程序。

  3. 對於希望在什麼樣的網絡資源 一個進程持有退房lsofnetstat(8)-p選項。

的停止信號問題與你描述通常與self-pipe trick解決阻塞插座。

+0

謝謝尼古拉! 你能確認,即使我使用PTHREAD,我也有使用pthread_cancel或pthread_kill或其他函數的問題嗎?由於操作系統中的網絡資源,相同的自我管理技巧必須適用,對吧? – user311906 2010-04-13 16:05:07

+0

我不會說* must *,但它的工作原理是相同的('boost :: thread'是在Unix上用PThreads實現的。) – 2010-04-13 16:26:41

2

當你殺死一個線程時,你不能確定它擁有哪些資源。例如,它可能持有堆互斥鎖;如果殺死線程,互斥鎖將保持鎖定狀態,並且任何人(在您的進程中)都將無法分配動態內存。

通過和平共識而不是武力來做這些事情要好得多。 只需添加一種方式,告訴您的線程它不再需要它。它可以是一個boost::condition。線程會檢查這種情況,並在發出信號時停止。

+0

HI ATZZ。感謝您的答覆。在我的代碼中,實際上我沒有任何互斥體。你認爲使用boost :: condition比使用boost :: thread :: interrupt()殺死線程更好嗎? – user311906 2010-04-13 15:55:58

+0

我不確定boost :: thread是否有類似的東西,但是pthreads API特別支持pthread_atexit()作爲線程釋放其在線程終止時管理的資源的一種方式。把pthread_atexit()想象成類似於線程的「最後的遺囑」。 – 2010-04-13 16:44:21

+0

@克里斯克利蘭 - 你的意思是pthread_cleanup_push()?它可以幫助您明確控制的資源,但對於您隱式使用的資源(在您使用的庫的實現中)或系統資源有什麼幫助? – atzz 2010-04-14 07:29:10