2012-09-14 117 views
0

如果我使用TerminateThread函數在Windows上終止線程,該函數返回或終止asychnronous後該線程是否真正終止?線程在調用TerminateThread時實際終止了什麼時候?

+1

[事實上,沒有理由使用TerminateThread。只有當你精確地控制線程正在做什麼時(例如,你知道它不會執行堆分配,並且它不在關鍵部分內),它纔是安全的。但是,如果你是該線程函數的程序員,那麼爲什麼不編寫從某個事件或標誌處的線程函數安全地返回的代碼,或者在需要時調用ExitThread?](http://adilevin.wordpress.com/tag/terminatethread /) –

+0

事實上,我知道'TerminateThread'具有的含義,但我仍然對代碼執行停止感興趣,因爲文檔沒有回答這個問題。 – Christoph

回答

5

定義「實際終止」。文檔說該線程不能執行更多的用戶模式代碼,所以有效:是的,它被終止了,代碼中的任何內容都不會再被該線程執行。

如果你在終止之後立即使用「WaitForSingleObject」,我想可能仍然會有一些輕微的延遲,因爲Windows正在進行清理。

順便說一句:TerminateThread是結束一個線程最糟糕的方式。嘗試使用其他一些同步手段,例如告訴線程停止的全局變量,或者例如事件。

+0

這就是我的意思:一旦TerminateThread返回,傳遞給'CreateThread'的函數就不會執行代碼。 – Christoph

3

終止一個線程類似於殺死一個進程,僅在每個線程級別。它實際上可以通過在目標線程中產生(不可捕獲的)信號來實現。

結果基本相同:您的程序沒有處於任何特定的可預測狀態。死線程沒有太多可以做。程序的控制流程通常是不確定的,因此在存在線程終止的情況下推斷程序的行爲是非常困難的。基本上,除非你的線程做的事情非常狹窄,特殊和受限(例如每秒增加一個原子計數器),否則沒有好的模型來終止一個線程,並且對於程序之後的狀態線程終止。

不要這樣做。設計您的線程,以便您可以與他們溝通,並使他們的輸入功能可以返回。設計您的程序,以便您可以最終加入所有線程並對所有內容進行計算。

+0

那麼,直到最後一段還是可以的,但是我想我們總是不同意這一點

0

這是一個同步調用。這並不意味着它必然會很快返回 - 如果操作系統不得不求助於使用其內核驅動程序停止線程,可能會有一些阻塞(即它實際上運行在與請求終止的線程不同的內核上)。

在應用程序運行期間(與在應用程序/進程終止期間使用它的內核截然不同),由用戶代碼調用TerminateThread存在問題,正如其他人明確所述。

我很努力地在應用程序運行期間用TerminateThread或任何其他方式永遠不會終止線程。應用程序生存期線程和線程池通常在操作系統在應用程序關閉時破壞它們之前不需要任何明確的終止。

相關問題