TerminateThread

TerminateThread

ateThread函數調用Termin ateThread函數也能夠終止線程的運行: ateThread。

函數的聲明


BOOL TerminateThread( HANDLEhThread, DWORDdwExitCode);

作用


在線程外終止一個線程,用於強制終止線程。

參數說明


HANDLE hThread:被終止的線程的句柄,為CWinThread指針。
DWORD dwExitCode:退出碼。

返回值


函數執行成功則返回非零值,執行失敗返回0。調用getlasterror獲得返回的值。

注意


避免在new和delete之間執行TerminateThread,否則程序將不能在繼續使用new了。

終止線程的運行


若要終止線程的運行,可以使用下面的方法:
· 線程函數返回(最好使用這種方法)。
· 通過調用E x i t T h r e a d函數,線程將自行撤消(最好不要使用這種方法)。
· 同一個進程或另一個進程中的線程調用Te r m i n a t e T h r e a d函數(應該避免使用這種方法)。
· 包含線程的進程終止運行(應該避免使用這種方法)。

TerminateThread與ExitThread的區別


ExitThread函數
可以讓線程調用ExitThread函數,以便強制線程終止運行:
該函數將終止線程的運行,並導致操作系統清除該線程使用的所有操作系統資源。但是,C++資源(如C++類對象)將不被撤消。由於這個原因,最好從線程函數返回,而不是通過調用ExitThread來返回。
當然,可以使用ExitThread的dwExitThread參數告訴系統將線程的退出代碼設置為什麼。ExitThread函數並不返回任何值,因為線程已經終止運行,不能執行更多的代碼。
注意終止線程運行的最佳方法是讓它的線程函數返回。但是,如果使用本節介紹的方法,應該知道ExitThread函數是Wi n d o w s用來撤消線程的函數。如果編寫C/C++代碼,那麼決不應該調用ExitThread。應該使用Visual C++運行期庫函數_endthreadex。如果不使用Microsoft的Visual C++編譯器,你的編譯器供應商有它自己的ExitThread的替代函數。不管這個替代函數是什麼,都必須使用。
TerminateThread函數
調用TerminateThread函數也能夠終止線程的運行:
與ExitThread不同,ExitThread總是撤消調用的線程,而TerminateThread能夠撤消任何線程。hThread參數用於標識被終止運行的線程的句柄。當線程終止運行時,它的退出代碼成為你作為dwExitCode參數傳遞的值。同時,線程的內核對象的使用計數也被遞減。
注意TerminateThread函數是非同步運行的函數,也就是說,它告訴系統你想要線程終止運行,但是,當函數返回時,不能保證線程被撤消。如果需要確切地知道該線程已經終止運行,必須調用WaitForSingleObject或者類似的函數,傳遞線程的
句柄。
設計良好的應用程序從來不使用這個函數,因為被終止運行的線程收不到它被撤消的通知。線程不能正確地清除,並且不能防止自己被撤消。注意當使用返回或調用ExitThread的方法撤消線程時,該線程的內存堆棧也被撤消。但是,如果使用TerminateThread,那麼在擁有線程的進程終止運行之前,系統不撤消該線程的堆棧。Microsoft故意用這種方法來實現TerminateThread。如果其他仍然正在執行的線程要引用強制撤消的線程堆棧上的值,那麼其他的線程就會出現訪問違規的問題。如果將已經撤消的線程的堆棧留在內存中,那麼其他線程就可以繼續很好地運行。此外,當線程終止運行時, DLL通常接收通知。如果使用Terminate Thread 強迫線程終止,DLL就不接收通知,這能阻止適當的清除