終止線程
終止線程會產生下列結果:
- 線程所擁有的任何資源,例如視窗和掛勾,會被釋放。
- 線程結束代碼已設定。
- 線程對象已發出訊號。
- 如果線程是進程中唯一的作用中線程,則會終止進程。 如需詳細資訊,請參閱 終止進程。
GetExitCodeThread 函式會傳回線程的終止狀態。 線程執行時,其終止狀態會STILL_ACTIVE。 當線程終止時,其終止狀態會從STILL_ACTIVE變更為線程的結束代碼。
當執行緒終止時,執行緒物件的狀態會變更為已觸發,釋放所有等待該執行緒終止的其他執行緒。 如需同步處理的詳細資訊,請參閱 同步處理多個線程的執行。
當線程終止時,除非線程的所有開啟句柄都關閉,否則不會釋放其線程物件。
線程的終止方式
線程會執行,直到發生下列其中一個事件為止:
- 線程會呼叫 ExitThread 函式。
- 進程的任何線程會呼叫 ExitProcess 函式。
- 線程函式回傳。
- 任何線程都會呼叫具有線程句柄的 TerminateThread 函式。
- 任何線程都會使用程式的句柄來呼叫 TerminateProcess 函式。
線程的結束代碼是 呼叫 exitThread中指定的值、ExitProcess、TerminateThread或 TerminateProcess或 thread 函式傳回的值。
如果線程由 ExitThread終止,則系統會呼叫每個附加 DLL 的進入點函式,指出線程與 DLL 中斷連結(除非您呼叫 DisableThreadLibraryCalls 函式)。 如果執行緒由 ExitProcess終止,則只會呼叫一次 DLL 的入口點函式,以表示該進程正在卸載。 當線程 TerminateThread 或 TerminateProcess終止時,DLL 不會收到通知。 如需 DLL 的詳細資訊,請參閱 Dynamic-Link 連結庫。
TerminateThread 和 TerminateProcess 函式應該只在極端情況下使用,因為它們不允許線程清除、不要通知附加 DLL,也不會釋放初始堆疊。 此外,進程終止之前,線程所擁有物件的句柄不會關閉。 下列步驟提供更佳的解決方案:
- 使用 createEvent函式建立事件物件。
- 建立線程。
- 每個線程都會呼叫 waitForSingleObject 函式來監視事件狀態。 使用零的等候逾時間隔。
- 當事件設定為訊號狀態時,每個線程都會終止自己的執行(WaitForSingleObject 傳回WAIT_OBJECT_0)。