解析C/C++中若何終止線程的運轉。本站提示廣大學習愛好者:(解析C/C++中若何終止線程的運轉)文章只能為提供參考,不一定能成為您想要的結果。以下是解析C/C++中若何終止線程的運轉正文
想要終止線程的運轉,可使用以下辦法:
1、線程函數前往(最好應用該辦法)。
2、經由過程挪用ExitThread函數,線程將自行取消(最好不應用該辦法)。
3、統一個過程或另外一個過程中的線程挪用TerminateThread函數(應防止應用該辦法)。
4、ExitProcess和TerminateProcess函數也能夠用來終止線程的運轉(應防止應用該辦法)。
上面將具體引見終止線程運轉的辦法:1-4,並解釋線程終止運轉時會湧現何種情形:5。
1、線程函數前往
一直都應當將線程設計成如許的情勢,即當想要線程終止運轉時,它們就可以夠前往。這是確保一切線程資本被准確地消除的獨一方法。
假如線程可以或許前往,便可以確保以下事項的完成:
(1)在線程函數中創立的一切C++對象均將經由過程它們的取消函數准確地取消。
(2)操作體系將准確地釋放線程客棧應用的內存。
(3)體系將線程的加入代碼(在線程的內查對象中保護)設置為線程函數的前往值。
(4)體系將遞加線程內查對象的應用計數。
2、ExitThread函數
可讓線程挪用ExitThread函數,以便強迫線程終止運轉:
函數原型:
VOID ExitThread(DWORD dwExitCode);
該函數將終止線程的運轉,並招致操作體系消除該線程應用的一切操作體系資本。然則,C++資本(如C++類對象)將不被取消。因為這個緣由,最好從線程函數前往,而不是經由過程挪用ExitThread來前往。
固然,可使用ExitThread的dwExitThread參數告知體系將線程的加入代碼設置為何。ExitThread函數其實不前往任何值,由於線程曾經終止運轉,不克不及履行更多的代碼。
留意終止線程運轉的最好辦法是讓它的線程函數前往。然則,假如應用本節引見的辦法,應當曉得ExitThread函數是Windows用來取消線程的函數。假如編寫C/C++代碼,那末決不該該挪用ExitThread。應當應用Visual C++運轉期庫函數_endthreadex。假如不應用Microsoft的Visual C++編譯器,你的編譯器供給商有它本身的ExitThread的替換函數。不論這個替換函數是甚麼,都必需應用。
3、TerminateThread函數
挪用TerminateThread函數也可以或許終止線程的運轉:
函數原型:
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode);
與ExitThread分歧,ExitThread老是取消挪用的線程,而TerminateThread可以或許取消任何線程。hThread參數用於標識被終止運轉的線程的句柄。當線程終止運轉時,它的加入代碼成為你作為dwExitCode參數傳遞的值。同時,線程的內查對象的應用計數也被遞加。
留意TerminateThread函數是異步運轉的函數,也就是說,它告知體系你想要線程終止運轉,然則,當函數前往時,不克不及包管線程被取消。假如須要確實地曉得該線程曾經終止運轉,必需挪用WaitForSingleObject或許相似的函數,傳遞線程的句柄。
設計優越的運用法式歷來不應用這個函數,由於被終止運轉的線程收不到它被取消的告訴。線程不克不及准確地消除,而且不克不及避免本身被取消。
留意當應用前往或挪用ExitThread的辦法取消線程時,該線程的內存客棧也被取消。然則,假如應用TerminateThread,那末在具有線程的過程終止運轉之前,體系不取消該線程的客棧。Microsoft有意用這類辦法來完成TerminateThread。假如其他依然正在履行的線程要援用強迫取消的線程客棧上的值,那末其他的線程就會湧現拜訪背規的成績。假如將曾經取消的線程的客棧留在內存中,那末其他線程便可以持續很好地運轉。
另外,當線程終止運轉時, DLL平日吸收告訴。假如應用TerminateThread 強制線程終止,DLL就不吸收告訴,這能阻攔恰當的消除。
4、在過程終止運轉時取消線程
ExitProcess和TerminateProcess函數也能夠用來終止線程的運轉。差異在於這些線程將會使終止運轉的過程中的一切線程全體終止運轉。別的,因為全部過程曾經被封閉,過程應用的一切資本確定已被消除。這固然包含一切線程的客棧。這兩個函數會招致過程中的殘剩線程被強迫取消,就像從每一個殘剩的線程挪用TerminateThread一樣。明顯,這意味著准確的運用法式消除沒有產生,即C++對象取消函數沒有被挪用,數據沒有轉至磁盤等等。
5、線程終止運轉時產生的操作
當線程終止運轉時,會產生以下操作:
(1)線程具有的一切用戶對象均被釋放。在Windows中,年夜多半對象是由包括創立這些對象的線程的過程具有的。然則一個線程具有兩個用戶對象,即窗口和掛鉤。當線程終止運轉時,體系會主動取消任何窗口,而且卸載線程創立的或裝置的任何掛鉤。其他對象只要在具有線程的過程終止運轉時才被取消。
(2)線程的加入代碼從STILL_ACTIVE改成傳遞給ExitThread或TerminateThread的代碼。
(3)線程內查對象的狀況變成已告訴。
(4)假如線程是過程中最初一個運動線程,體系也將過程視為曾經終止運轉。
(5)線程內查對象的應用計數遞加1。
當一個線程終止運轉時,在與它相干聯的線程內查對象的一切未停止的援用封閉之前,該內查對象不會主動被釋放。
一旦線程不再運轉,體系中就沒有其余線程可以或許處置該線程的句柄。但是其余線程可以挪用GetExitcodeThread來檢討由hThread標識的線程能否曾經終止運轉。假如它曾經終止運轉,則肯定它的加入代碼:
函數原型:
BOOL GetExitCodeThread(
HANDLE hThread,
PDWORD pdwExitCode);
加入代碼的值在pdwExitCode指向的DWORD中前往。假如挪用GetExitCodeThread時線程還沒有終止運轉,該函數就用STILL_ACTIVE標識符(界說為0x103)填入DWORD。假如該函數運轉勝利,便前往TRUE。