終止乙個執行緒

2021-09-24 11:19:47 字數 1337 閱讀 1389

可以讓執行緒呼叫exitthread函式,以便強制執行緒終止執行:

函式原型:

void exitthread(dword dwexitcode);
該函式將終止執行緒的執行,並導致作業系統清除該執行緒使用的所有作業系統資源。但是,c++ 資源(如c++ 類物件)將不被撤消。由於這個原因,最好從執行緒函式返回,而不是通過呼叫exitthread來返回。

當然,可以使用exitthread的dwexitthread引數告訴系統將執行緒的退出**設定為什麼。exitthread函式並不返回任何值,因為執行緒已經終止執行,不能執行更多的**。

注意終止執行緒執行的最佳方法是讓它的執行緒函式返回。但是,如果使用本節介紹的方法,應該知道exitthread函式是windows用來撤消執行緒的函式。如果編寫c/c++ **,那麼決不應該呼叫exitthread。應該使用visual c++ 執行期庫函式_endthreadex。如果不使用microsoft的visual c++編譯器,你的編譯器**商有它自己的exitthread的替代函式。不管這個替代函式是什麼,都必須使用。

呼叫terminatethread函式也能夠終止執行緒的執行:

函式原型:

bool terminatethread( 

handle hthread,

dword dwexitcode);

與exitthread不同,exitthread總是撤消呼叫的執行緒,而terminatethread能夠撤消任何執行緒。hthread引數用於標識被終止執行的執行緒的控制代碼。當執行緒終止執行時,它的退出**成為你作為dwexitcode引數傳遞的值。同時,執行緒的核心物件的使用計數也被遞減。

注意terminatethread函式是非同步執行的函式,也就是說,它告訴系統你想要執行緒終止執行,但是,當函式返回時,不能保證執行緒被撤消。如果需要確切地知道該執行緒已經終止執行,必須呼叫waitforsingleobject或者類似的函式,傳遞執行緒的控制代碼。

設計良好的應用程式從來不使用這個函式,因為被終止執行的執行緒收不到它被撤消的通知。執行緒不能正確地清除,並且不能防止自己被撤消。

注意當使用返回或呼叫exitthread的方法撤消執行緒時,該執行緒的記憶體堆疊也被撤消。但是,如果使用terminatethread,那麼在擁有執行緒的程序終止執行之前,系統不撤消該執行緒的堆疊。microsoft故意用這種方法來實現terminatethread。如果其他仍然正在執行的執行緒要引用強制撤消的執行緒堆疊上的值,那麼其他的執行緒就會出現訪問違規的問題。如果將已經撤消的執行緒的堆疊留在記憶體中,那麼其他執行緒就可以繼續很好地執行。

此外,當執行緒終止執行時, dll通常接收通知。如果使用terminatethread 強迫執行緒終止,dll就不接收通知,這能阻止適當的清除。

那麼要怎麼終止乙個執行緒呢?

雖然thread.stop 方法可以結束乙個執行緒,但是eclipse已經將這個方法標註成乙個 廢棄 的方法,也就是不推薦使用,原因大家都知道,就是stop 方法直接終止執行緒並釋放掉鎖,容易造成一些對資料進行修改的執行緒出問題,例如導致多個執行緒讀到不一致的資料的情況。看看下面這個例子 要做的事情...

執行緒的阻塞 通過外部干涉終止乙個執行緒

執行緒的生命週期 執行緒的阻塞 thread類中提供了join方法用來合併執行緒,原本有兩個執行緒兩條通道,使用了join方法以後就只剩一條通道,那麼此時兩個執行緒不再併發執行,而是順序執行,那麼如何確定這兩個執行緒誰先執行呢?假設,我在main方法中有執行緒t1,那麼此時就是main,和t1兩個執...

Qt學習之如何啟動和終止乙個執行緒

1 qt執行緒池實驗研究與分析 qthread與和qthreadpool qrunnable使用上的區別 2 qrunnable中,如何接收tcp連線資訊 今天來看看qt如何啟動乙個執行緒吧,就以精通qt4程式設計的為例 先來給出每個檔案的相關 然後再加以分析 cpp dialog.h ifndef...