一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - 解析C/C++中如何終止線程的運行

解析C/C++中如何終止線程的運行

2020-12-14 14:41C語言教程網(wǎng) C/C++

本篇文章是對C/C++中如何終止線程運行的方法進行了詳細(xì)的分析介紹,需要的朋友參考下

想要終止線程的運行,可以使用以下方法:
1、線程函數(shù)返回(最好使用該方法)。
2、通過調(diào)用ExitThread函數(shù),線程將自行撤消(最好不使用該方法)。
3、同一個進程或另一個進程中的線程調(diào)用TerminateThread函數(shù)(應(yīng)避免使用該方法)。
4、ExitProcess和TerminateProcess函數(shù)也可以用來終止線程的運行(應(yīng)避免使用該方法)。

下面將詳細(xì)介紹終止線程運行的方法:1-4,并說明線程終止運行時會出現(xiàn)何種情況:5。

1、線程函數(shù)返回
始終都應(yīng)該將線程設(shè)計成這樣的形式,即當(dāng)想要線程終止運行時,它們就能夠返回。這是確保所有線程資源被正確地清除的唯一辦法。
如果線程能夠返回,就可以確保下列事項的實現(xiàn):
(1)在線程函數(shù)中創(chuàng)建的所有C++對象均將通過它們的撤消函數(shù)正確地撤消。
(2)操作系統(tǒng)將正確地釋放線程堆棧使用的內(nèi)存。
(3)系統(tǒng)將線程的退出代碼(在線程的內(nèi)核對象中維護)設(shè)置為線程函數(shù)的返回值。
(4)系統(tǒng)將遞減線程內(nèi)核對象的使用計數(shù)。

2、ExitThread函數(shù)
可以讓線程調(diào)用ExitThread函數(shù),以便強制線程終止運行:
函數(shù)原型:
VOID ExitThread(DWORD dwExitCode);
該函數(shù)將終止線程的運行,并導(dǎo)致操作系統(tǒng)清除該線程使用的所有操作系統(tǒng)資源。但是,C++資源(如C++類對象)將不被撤消。由于這個原因,最好從線程函數(shù)返回,而不是通過調(diào)用ExitThread來返回。
當(dāng)然,可以使用ExitThread的dwExitThread參數(shù)告訴系統(tǒng)將線程的退出代碼設(shè)置為什么。ExitThread函數(shù)并不返回任何值,因為線程已經(jīng)終止運行,不能執(zhí)行更多的代碼。
注意終止線程運行的最佳方法是讓它的線程函數(shù)返回。但是,如果使用本節(jié)介紹的方法,應(yīng)該知道ExitThread函數(shù)是Windows用來撤消線程的函數(shù)。如果編寫C/C++代碼,那么決不應(yīng)該調(diào)用ExitThread。應(yīng)該使用Visual C++運行期庫函數(shù)_endthreadex。如果不使用Microsoft的Visual C++編譯器,你的編譯器供應(yīng)商有它自己的ExitThread的替代函數(shù)。不管這個替代函數(shù)是什么,都必須使用。

3、TerminateThread函數(shù)
調(diào)用TerminateThread函數(shù)也能夠終止線程的運行:
函數(shù)原型:

復(fù)制代碼 代碼如下:

BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode);

 
與ExitThread不同,ExitThread總是撤消調(diào)用的線程,而TerminateThread能夠撤消任何線程。hThread參數(shù)用于標(biāo)識被終止運行的線程的句柄。當(dāng)線程終止運行時,它的退出代碼成為你作為dwExitCode參數(shù)傳遞的值。同時,線程的內(nèi)核對象的使用計數(shù)也被遞減。
注意TerminateThread函數(shù)是異步運行的函數(shù),也就是說,它告訴系統(tǒng)你想要線程終止運行,但是,當(dāng)函數(shù)返回時,不能保證線程被撤消。如果需要確切地知道該線程已經(jīng)終止運行,必須調(diào)用WaitForSingleObject或者類似的函數(shù),傳遞線程的句柄。
設(shè)計良好的應(yīng)用程序從來不使用這個函數(shù),因為被終止運行的線程收不到它被撤消的通知。線程不能正確地清除,并且不能防止自己被撤消。
注意當(dāng)使用返回或調(diào)用ExitThread的方法撤消線程時,該線程的內(nèi)存堆棧也被撤消。但是,如果使用TerminateThread,那么在擁有線程的進程終止運行之前,系統(tǒng)不撤消該線程的堆棧。Microsoft故意用這種方法來實現(xiàn)TerminateThread。如果其他仍然正在執(zhí)行的線程要引用強制撤消的線程堆棧上的值,那么其他的線程就會出現(xiàn)訪問違規(guī)的問題。如果將已經(jīng)撤消的線程的堆棧留在內(nèi)存中,那么其他線程就可以繼續(xù)很好地運行。
此外,當(dāng)線程終止運行時, DLL通常接收通知。如果使用TerminateThread 強迫線程終止,DLL就不接收通知,這能阻止適當(dāng)?shù)那宄?/p>

 

4、在進程終止運行時撤消線程
ExitProcess和TerminateProcess函數(shù)也可以用來終止線程的運行。差別在于這些線程將會使終止運行的進程中的所有線程全部終止運行。另外,由于整個進程已經(jīng)被關(guān)閉,進程使用的所有資源肯定已被清除。這當(dāng)然包括所有線程的堆棧。這兩個函數(shù)會導(dǎo)致進程中的剩余線程被強制撤消,就像從每個剩余的線程調(diào)用TerminateThread一樣。顯然,這意味著正確的應(yīng)用程序清除沒有發(fā)生,即C++對象撤消函數(shù)沒有被調(diào)用,數(shù)據(jù)沒有轉(zhuǎn)至磁盤等等。

5、線程終止運行時發(fā)生的操作
當(dāng)線程終止運行時,會發(fā)生下列操作:

(1)線程擁有的所有用戶對象均被釋放。在Windows中,大多數(shù)對象是由包含創(chuàng)建這些對象的線程的進程擁有的。但是一個線程擁有兩個用戶對象,即窗口和掛鉤。當(dāng)線程終止運行時,系統(tǒng)會自動撤消任何窗口,并且卸載線程創(chuàng)建的或安裝的任何掛鉤。其他對象只有在擁有線程的進程終止運行時才被撤消。
(2)線程的退出代碼從STILL_ACTIVE改為傳遞給ExitThread或TerminateThread的代碼。
(3)線程內(nèi)核對象的狀態(tài)變?yōu)橐淹ㄖ?br /> (4)如果線程是進程中最后一個活動線程,系統(tǒng)也將進程視為已經(jīng)終止運行。
(5)線程內(nèi)核對象的使用計數(shù)遞減1。
當(dāng)一個線程終止運行時,在與它相關(guān)聯(lián)的線程內(nèi)核對象的所有未結(jié)束的引用關(guān)閉之前,該內(nèi)核對象不會自動被釋放。
一旦線程不再運行,系統(tǒng)中就沒有別的線程能夠處理該線程的句柄。然而別的線程可以調(diào)用GetExitcodeThread來檢查由hThread標(biāo)識的線程是否已經(jīng)終止運行。如果它已經(jīng)終止運行,則確定它的退出代碼:
函數(shù)原型:

復(fù)制代碼 代碼如下:

BOOL GetExitCodeThread(
HANDLE hThread,
PDWORD pdwExitCode);


退出代碼的值在pdwExitCode指向的DWORD中返回。如果調(diào)用GetExitCodeThread時線程尚未終止運行,該函數(shù)就用STILL_ACTIVE標(biāo)識符(定義為0x103)填入DWORD。如果該函數(shù)運行成功,便返回TRUE。

延伸 · 閱讀

精彩推薦
  • C/C++學(xué)習(xí)C++編程的必備軟件

    學(xué)習(xí)C++編程的必備軟件

    本文給大家分享的是作者在學(xué)習(xí)使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    strcpy 和strcnpy函數(shù)是字符串復(fù)制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內(nèi)存中的數(shù)據(jù)都是暫時的,當(dāng)程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現(xiàn)電腦關(guān)機程序

    C語言實現(xiàn)電腦關(guān)機程序

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)電腦關(guān)機程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進行了詳細(xì)的分析介紹,需要的朋友參考下...

    C語言教程網(wǎng)7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實例之模擬計算器的相關(guān)資料,文中通過示...

    jia150610152021-06-07
主站蜘蛛池模板: 情侣奴伺候女王第2部分小说 | 亚欧有色在线观看免费版高清 | 国产成人精品曰本亚洲78 | 人与禽交3d动漫羞羞动漫 | 91破解版| 楚乔传第二部免费播放电视连续剧 | 精品美女国产互换人妻 | 微拍秒拍99福利精品小视频 | 九九久久国产精品免费热6 九九精品视频一区二区三区 | 鄂州一家三口完整版免费 | 国产欧美精品 | tube日本高清老少配 | 春意影院午夜爽爽爽免费 | 成人免费在线视频网 | 日本草草视频在线观看 | 女性全身裸露无遮挡 | 波多野结在线观看 | 91麻豆制片厂 | 午夜影院费试看黄 | 国产精品麻豆免费版 | 免费激情小视频 | 色婷婷激婷婷深爱五月老司机 | 亚洲精品一区二区观看 | 五月色天在线视频综合观看 | 操骚0 | www.青青草原| 韩国久久精品 | 99久视频 | 色播影院性播影院私人影院 | 久久夜色噜噜噜亚洲AV0000 | 国产午夜精品久久理论片小说 | 久久偷拍国2017 | 久久久免费观成人影院 | 韩国靠逼 | 国产精品1024永久免费视频 | 青青色在线 | 我要看靠逼片 | 日韩人成免费网站大片 | yellow片在线观看 | 红色一片在线影视 | 免费369看片入口 |