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就不接收通知,這能阻止適當的清除

相關詞條

相關搜尋

熱門詞條

聯絡我們