终结一个线程。
BOOL WINAPI TerminateThread(
_Inout_ HANDLE hThread,
_In_ DWORD dwExitCode
);
Parameters
- hThread [in, out]
-
要终结线程的句柄。这个句柄必须有THREAD_TERMINATE权利。
- dwExitCode [in]
-
线程的退出值。
返回值
如果函数成功,返回非0值。
如果失败,返回0.
注意
函数是用来推出线程。当函数调执行,目标线程没有机会执行任何用户级代码。与DLL关联的线程不被通知就终结了。系统是否线程的初始栈。
Windows Server 2003 and Windows XP: 目标线程的栈没被释放,会引起资源泄漏。
本函数是危险的,只能在极端情况下运用。如果你知道目标线程正在做什么,你可以调用TerminateThread;而且你可以控制目标线程在终结时运行的代码。比如,TerminateThread调用可能会引起下列问题:
- 如果目标线程拥有关键段,那么关键段不会被释放。【这将引起资源泄漏和死锁】
- 如果目标线程在堆上申请内存,不会被释放。【内存泄漏】
- 如果目标线程执行某个kernel32调用,当天终结时,对于线程所在进程的kernel32状态会不连续。
- 如果目标线程在操作一个共享DLL的全局状态,DLL的状态可能被破坏,从而影响DLL的其他使用者。
调用了TerminateThread,线程就不能自我保护,没有控制自己handle的权利了。通过CreateThread和CreateProcess返回的线程句柄用THREAD_TERMINATE的权利,因此任何调用者都能通过这些句柄来终结这个线程。
如果目标线程是进程的最后一个线程,线程的进程也会终结。
线程对象的状态会被激发,释放任何其他线程等待此线程终结的信号。【也就是WaitForSingleObject[threadID,]会变为激发态】
终止一个线程没有必要从系统移除线程对象。当最后一个线程句柄关闭时线程对象被删除。