TerminateThread函數學習

終結一個線程。windows

 

BOOL WINAPI TerminateThread(
  _Inout_  HANDLE hThread,
  _In_     DWORD dwExitCode
);

Parameters

hThread [in, out]

要終結線程的句柄。這個句柄必須有THREAD_TERMINATE權利。ide

dwExitCode [in]

線程的退出值。函數

返回值

 

若是函數成功,返回非0值。spa

若是失敗,返回0.線程

注意

函數是用來推出線程。當函數調執行,目標線程沒有機會執行任何用戶級代碼。與DLL關聯的線程不被通知就終結了。系統是否線程的初始棧。對象

Windows Server 2003 and Windows XP:  目標線程的棧沒被釋放,會引發資源泄漏。進程

本函數是危險的,只能在極端狀況下運用。若是你知道目標線程正在作什麼,你能夠調用TerminateThread;並且你能夠控制目標線程在終結時運行的代碼。好比,TerminateThread調用可能會引發下列問題:內存

  • 若是目標線程擁有關鍵段,那麼關鍵段不會被釋放。【這將引發資源泄漏和死鎖】
  • 若是目標線程在堆上申請內存,不會被釋放。【內存泄漏】
  • 若是目標線程執行某個kernel32調用,當天終結時,對於線程所在進程的kernel32狀態會不連續。
  • 若是目標線程在操做一個共享DLL的全局狀態,DLL的狀態可能被破壞,從而影響DLL的其餘使用者。

調用了TerminateThread,線程就不能自我保護,沒有控制本身handle的權利了。經過CreateThreadCreateProcess返回的線程句柄用THREAD_TERMINATE的權利,所以任何調用者都能經過這些句柄來終結這個線程。ci

若是目標線程是進程的最後一個線程,線程的進程也會終結。資源

線程對象的狀態會被激發,釋聽任何其餘線程等待此線程終結的信號。【也就是WaitForSingleObject[threadID,]會變爲激發態】

終止一個線程沒有必要從系統移除線程對象。當最後一個線程句柄關閉時線程對象被刪除。

相關文章
相關標籤/搜索