終結執行緒

終止執行緒有下列結果:

  • 執行緒擁有的任何資源,例如視窗和勾點,都已釋放。
  • 執行緒結束代碼已設定。
  • 執行緒物件會發出訊號。
  • 如果執行緒是進程中唯一的作用中線程,則會終止進程。 如需詳細資訊,請參閱 終止進程

GetExitCodeThread函式會傳回執行緒的終止狀態。 執行緒執行時,其終止狀態會STILL_ACTIVE。 當執行緒終止時,其終止狀態會從STILL_ACTIVE變更為執行緒的結束代碼。

當執行緒終止時,執行緒物件的狀態會變更為已發出訊號,釋放任何其他等候執行緒終止的執行緒。 如需同步處理的詳細資訊,請參閱 同步處理多個執行緒的執行

當執行緒終止時,除非執行緒的所有開啟控制碼都關閉,否則不會釋放執行緒物件的執行緒物件。

執行緒終止方式

執行緒會在發生下列其中一個事件之前執行:

  • 執行緒會呼叫 ExitThread 函式。
  • 進程的任何執行緒都會呼叫 ExitProcess 函式。
  • 執行緒函式會傳回 。
  • 任何執行緒都會使用執行緒控制碼呼叫 TerminateThread 函式。
  • 任何執行緒都會使用進程的控制碼呼叫 TerminateProcess 函式。

執行緒的結束代碼是呼叫 ExitThread、ExitProcess、TerminateThreadTerminateProcess中指定的值,或是執行緒函式所傳回的值。

如果執行緒由 ExitThread終止,系統會呼叫每個附加 DLL 的進入點函式,其值表示執行緒與 DLL (中斷連結,除非您呼叫 DisableThreadLibraryCalls 函式) 。 如果 ExitProcess終止執行緒,則會叫用 DLL 進入點函式一次,表示進程中斷連結。 當 Thread 由 TerminateThreadTerminateProcess終止時,DLL 不會收到通知。 如需 DLL 的詳細資訊,請參閱 Dynamic-Link 程式庫

TerminateThreadTerminateProcess函式應該只在極端情況下使用,因為它們不允許執行緒清除、不要通知附加的 DLL,也不會釋放初始堆疊。 此外,在進程終止之前,執行緒所擁有的物件控制碼不會關閉。 下列步驟提供更好的解決方案:

  • 使用 CreateEvent 函式建立事件物件。
  • 建立執行緒。
  • 每個執行緒都會藉由呼叫 WaitForSingleObject 函式來監視事件狀態。 使用零的等候逾時間隔。
  • 當事件設定為訊號狀態時,每個執行緒都會終止其本身的執行, (WaitForSingleObject 傳回WAIT_OBJECT_0) 。