2012-02-25 153 views
3

我正在設計一個線程庫。到目前爲止,我有一個方法來初始化庫,一個創建線程,另一個產生當前線程到就緒線程隊列中的下一個線程。如何知道何時殺死線程?

在我開始爲線程實現信號量之前,我想我應該儘快殺死線程並釋放它們分配的內存,但是我很難找出如何做到這一點。如何判斷線程何時「完成」?

+4

當他們從線程程序返回或調用相當於POSIX的'pthread_exit'的庫函數時如何?另外你爲什麼重新發明輪子? – 2012-02-25 01:46:00

+2

這非常依賴於操作系統。但強行殺死一個線程是最後的選擇。一般而言,您只需讓線程自然返回。 – 2012-02-25 01:48:13

回答

4

你不只是殺死線程安全或可靠 - 讓他們自然退出(當他們的入口返回)。

雖然系統提供了殺死線程的手段,但是如果要繼續的話,幾乎任何C++程序都可能會出現未定義的行爲。你可以想象一下,殺死可能會產生沒有副作用(對程序的其餘部分),但該程序根本不像習慣C++。這樣的計劃將是非常奇特的,有許多不尋常和嚴格的限制。

當您想知道某個線程是否退出或退出時,您可以在退出之前添加一些清理以追蹤其狀態。

當您希望能夠請求線程退出(自然)時,請考慮運行循環和消息。

0

當他們完成運行他們的分叉過程時,你不會顯式地終止這些線程,因爲這樣做的代碼仍然會在要被終止的線程的上下文中。

您有一個調度程序/中斷處理程序,它處理線程的上下文切換並維護一些隊列用於管理此線程。你可以讓它保存對被殺線程的引用,例如scheduler->SetThreadToKill(currentThread);,裏面可能是你的finish()方法(或類似的),它爲相應的線程設置一個標誌。

當發生上下文切換,並且已將當前線程的所有數據結構與下一個線程的所有數據結構換出時,調度程序可以爲所有設置了toBeKilled標誌的線程調用析構函數。

0

到目前爲止,殺死線程的最佳策略是不明確地去做(除非你是一個操作系統,即在應用程序關閉時)。將消息和任務排隊到圍繞某個隊列執行更多工作的線程。如果你不寫任何代碼來不斷地創建,創建,啓動,終止,刪除,測試,檢查,登記,除名,入隊,出隊和微管理線程,那麼該代碼不能包含錯誤。