久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C 對(duì)象是怎么死的?Win32線程篇...

 ShaneWu 2009-07-02

 C++對(duì)象是怎么死的,?Win32線程篇收藏

  在前面的帖子 里聊完了進(jìn)程終止對(duì)C++對(duì)象析構(gòu)的影響。今天咱們來(lái)說(shuō)一下線程對(duì)于C++對(duì)象析構(gòu)的影響。
由于C++ 03標(biāo)準(zhǔn)沒(méi)有包含線程的概念,,而C++ 0x尚未正式發(fā)布,。所以對(duì)線程的討論只好根據(jù)特定的操作系統(tǒng)平臺(tái)來(lái)談。對(duì)于操作系統(tǒng)自帶的線程API,,目前比較流行的款式是Windows平臺(tái)提供的線程 API和POSIX平臺(tái)上的pthread API,。但是這兩種線程API的差異實(shí)在是太大,沒(méi)法拿出來(lái)一起聊,。我只好把“線程篇”的帖子再拆分一下,,今天先來(lái)聊一聊Win32的線程API。
另外,,對(duì)于進(jìn)行跨平臺(tái)開(kāi)發(fā)的同學(xué),,應(yīng)該已經(jīng)用上了某些跨平臺(tái)的第三方線程庫(kù)(比如ACE、Boost等),,對(duì)于這些庫(kù)的介紹,,初步打算放到“C++的可移植性和跨平臺(tái)開(kāi)發(fā) ”系列中。

兩套APIOS API vs CRT API
本來(lái)照例要先介紹線程的幾種死法,,但是考慮到很多Windows程序員經(jīng)?;煜€程API,搞不清楚到底該用哪個(gè),。所以先來(lái)說(shuō)一下兩套線程API的問(wèn)題,。
首先,Windows操作系統(tǒng)本身提供了線程的創(chuàng)建函數(shù)CreateThread 和銷(xiāo)毀函數(shù)ExitThread ,。其中的CreateThread 用于創(chuàng)建線程,,ExitThread 用于在線程函數(shù)內(nèi)部推出線程(也就是自殺)。
其次,,在Visual C++自帶的C運(yùn)行庫(kù)(以下簡(jiǎn)稱(chēng)CRT)中,,還帶了另外4個(gè)API函數(shù),分別是:_beginthread ,,_endthread ,,_beginthreadex_endthreadex ,。其中的_beginthread_beginthreadex 用于創(chuàng)建線程(它們內(nèi)部調(diào)用了CreateThread ),,_endthread_endthreadex 用于自殺(它們內(nèi)部調(diào)用了ExitThread )。
有同學(xué)看到這里,,被搞懵了,,心想:“干嘛要搞這么多玩意兒出來(lái)糊弄人,?有CreateThreadExitThread 不就夠了嘛,!”其實(shí)你有所不知,此中大有奧妙啊,。
因?yàn)镺S API作為操作系統(tǒng)本身提供的API函數(shù),,它被設(shè)計(jì)為語(yǔ)言無(wú)關(guān)的,。它們不光可以被C++調(diào)用,還可以被其它諸如VB,、Python,、Delphi等開(kāi)發(fā)語(yǔ)言來(lái)調(diào)用。所以它們不會(huì)(也不能夠)幫你處理一些和具體編程語(yǔ)言相關(guān)的瑣事,。
而CRT API雖然最終還是要調(diào)用OS API來(lái)完成核心的功能,,但是CRT API在不知不覺(jué)中多幫我們干了一些雖瑣碎但重要的工作。(如果同學(xué)們想窺探一下CRT API內(nèi)部都干了些啥,,可以拜讀一下Win32編程的經(jīng)典名著《Windows 核心編程》的6.7 章節(jié),,里面介紹得挺細(xì)致的)
費(fèi)了這么多口水,無(wú)非是要同學(xué)們牢記:以后在Windows平臺(tái)下開(kāi)發(fā)多線程程序,,千萬(wàn)不要 直接使用這兩個(gè)線程API(也就是CreateThreadExitThread ),,否則后果自負(fù) :-)
另外,順便補(bǔ)充一下,。除了上述提到的CRT庫(kù),。其它一些Windows平臺(tái)的C++庫(kù)也可能提供了線程的啟動(dòng)函數(shù)(比如MFC的AfxBeginThread),這些函數(shù)也對(duì)OS API進(jìn)行了包裝,,所以用起來(lái)也是安全的,。

三種死法
說(shuō)完了兩套API,開(kāi)始來(lái)討論一下線程的幾種死法,。線程和進(jìn)程一樣,,也有三種死法。詳見(jiàn)如下:
1,、自然死亡
一般來(lái)說(shuō),,每個(gè)線程都會(huì)對(duì)應(yīng)某個(gè)函數(shù)(以下稱(chēng)為“線程函數(shù)”)。線程函數(shù)是線程運(yùn)行的主體,。所謂的“自然死亡”,,就是通過(guò)return 語(yǔ)句結(jié)束線程函數(shù)的執(zhí)行。
2,、自殺
所謂的“自殺”,,就是當(dāng)前線程通過(guò)調(diào)用某API把自己 給停掉。前面已經(jīng)說(shuō)了OS API的壞話,,同學(xué)們應(yīng)該明白不能 再用它們,。那我們能否使用CRT API來(lái)進(jìn)行自殺呢?請(qǐng)看MSDN上的相關(guān)文檔 ,。上面說(shuō)了,,如果使用_endthread_endthreadex ,將導(dǎo)致析構(gòu)函數(shù)不被 調(diào)用。
3,、它殺
所謂的“它殺”,,很明顯,就是其它線程通過(guò)調(diào)用某API把當(dāng)前線程給強(qiáng)行 停掉,。對(duì)于Windows平臺(tái)來(lái)說(shuō),,實(shí)現(xiàn)“它殺”比較簡(jiǎn)單,使用TernimateThread 就直接干掉了(它殺也是最野蠻的),。

類(lèi)對(duì)象的析構(gòu)
前一個(gè)帖子 的 風(fēng)格,,還是把類(lèi)對(duì)象分為三種:局部非靜態(tài)對(duì)象、局部靜態(tài)對(duì)象,、非局部對(duì)象,。由于非局部對(duì)象是在main之前就創(chuàng)建、在進(jìn)程死亡時(shí)析構(gòu),,暫時(shí)與線程扯不上太 大關(guān)系,。剩下的兩種局部對(duì)象,在宿主線程(所謂宿主線程,,就是創(chuàng)建該局部對(duì)象的線程)死亡時(shí)會(huì)受到什么影響捏,?請(qǐng)看如下的對(duì)照表:
-------------------------
局部非靜態(tài)對(duì)象  局部靜態(tài)對(duì)象
自然死亡    能        能
自殺     不能       能
它殺     不能       能
-------------------------
從上述結(jié)果可以看出,Windows上線程的死法還是以自然死亡為最安全,,這點(diǎn)和進(jìn)程的死法類(lèi)似,。所以同學(xué)們?cè)赪indows上開(kāi)發(fā)時(shí),要盡量避免自殺和它殺,。

關(guān)于主線程之死
所謂“主線程”,,就是進(jìn)程啟動(dòng)時(shí),操作系統(tǒng)為該進(jìn)程默認(rèn)創(chuàng)建的第一個(gè)線程,。通俗地講,,可以把main 函數(shù)看成是主線程的線程函數(shù)。
主線程之死是有講究的,。由于前面已經(jīng)闡述了非自然死亡的壞處,,所以我們只討論主線程自然死亡這一種情況。當(dāng)主線程自然死亡時(shí)(也就是用returnmain 返回時(shí)),,會(huì)導(dǎo)致exit 函數(shù)被調(diào)用,,exit 函數(shù)就會(huì)開(kāi)始清除當(dāng)前進(jìn)程的各種資源,為進(jìn)程的死亡作準(zhǔn)備,。這時(shí)候,,如果還有其它活著的線程,也會(huì)被一起干掉(其效果類(lèi)似于它殺),。
為了防止出現(xiàn)上述情況,,主線程一定要負(fù)責(zé)最終的善后工作,。務(wù)必等到其它線程都死了,它才能死,。

Windows平臺(tái)上,有關(guān)線程的對(duì)象析構(gòu)問(wèn)題,,就聊到這,。下一個(gè)帖子 ,咱們來(lái)聊一下pthread相關(guān)的對(duì)象析構(gòu)話題,。

http://program-think./2009/03/cxx-object-destroy-with-thread-win32.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多