青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

C++對(duì)象是怎么死的

  我承認(rèn)這個(gè)帖子的名稱有標(biāo)題黨的嫌疑,但是暫時(shí)想不出更好的名稱了,只好先這樣了 :-(
  由于前天的帖子聊了架構(gòu)設(shè)計(jì)的多進(jìn)程問(wèn)題,所以今天想起來(lái)要聊一下和“C++進(jìn)程終止相關(guān)的那些事。與前幾個(gè)C++帖子的風(fēng)格類(lèi)似,今天聊的內(nèi)容,盡量局限于標(biāo)準(zhǔn)C++范疇,盡量不涉及特定的操作系統(tǒng)平臺(tái)。
進(jìn)程篇
  關(guān)于進(jìn)程的三種死法
  由于今天講的是進(jìn)程篇,自然得先搞明白進(jìn)程的幾種死法。其實(shí)進(jìn)程和大活人一樣,也有三種死法,分別是自然死亡、自殺、它殺。這三種死亡方式具體如下:
  1、自然死亡
  望文生義,自然死亡就是最自然的進(jìn)程退出方法。具體表現(xiàn)為通過(guò)return語(yǔ)句結(jié)束main函數(shù)。由于這種方法最優(yōu)雅(后面會(huì)說(shuō)),如果沒(méi)有其它特殊原因,強(qiáng)烈建議采用這種死法。
  2、自殺
  所謂的自殺,就是進(jìn)程自己調(diào)用某些API來(lái)自行了斷。在標(biāo)準(zhǔn)C++中,這幾個(gè)函數(shù)(exitabortterminateunexpected)可以用于進(jìn)程自殺。如果沒(méi)有額外設(shè)置,unexpected函數(shù)默認(rèn)會(huì)調(diào)用terminate函數(shù),terminate函數(shù)默認(rèn)會(huì)調(diào)用abort函數(shù)。所以自殺的方式基本上也就是exitabort兩種。exit相對(duì)abort來(lái)說(shuō)溫和一些,所以下文稱exit溫和自殺;相對(duì)地,把abort稱為激進(jìn)自殺
  3、它殺
  它殺其實(shí)也挺好理解,就是當(dāng)前進(jìn)程被其它進(jìn)程殺死。標(biāo)準(zhǔn)C++沒(méi)有提供用于它殺的API函數(shù),因此常用的方法是通過(guò)某些跨平臺(tái)的庫(kù)(如ACE)提供的API函數(shù)或者調(diào)用某些外部命令(如Posix系統(tǒng)的kill命令)來(lái)實(shí)現(xiàn)。
  上面說(shuō)了這幾種死法,有同學(xué)要問(wèn)了:進(jìn)程不同的死法和C++對(duì)象有什么關(guān)系捏?其實(shí)關(guān)系大大滴,請(qǐng)聽(tīng)我細(xì)細(xì)道來(lái)。

  
類(lèi)對(duì)象的析構(gòu)(銷(xiāo)毀)
  首先把類(lèi)對(duì)象分為三種:局部非靜態(tài)對(duì)象、局部靜態(tài)對(duì)象、非局部對(duì)象(出于習(xí)慣,以下簡(jiǎn)稱全局對(duì)象)。對(duì)于尚不清楚這幾種對(duì)象差異的同學(xué),請(qǐng)先找本C++入門(mén)書(shū)拜讀一下。進(jìn)程不同的死法對(duì)于這幾種對(duì)象是否能銷(xiāo)毀會(huì)有很大的影響。請(qǐng)看如下的對(duì)照表:
------------------------------
        局部非靜態(tài)對(duì)象  局部靜態(tài)對(duì)象  全局對(duì)象
  自然死亡    能        能      能
  溫和自殺    不能       能      能
  激進(jìn)自殺    不能       不能     不能
   它殺     不能       不能     不能
------------------------------
  從這個(gè)對(duì)照表可以看出,激進(jìn)自殺和它殺的效果類(lèi)似(各種類(lèi)對(duì)象都無(wú)法正常銷(xiāo)毀)。所以我們?cè)趯?xiě)程序時(shí)要極力避免上述這兩種情況。
  另外,溫和自殺也有不爽之處:不能正確地銷(xiāo)毀局部非靜態(tài)對(duì)象。準(zhǔn)確地說(shuō),應(yīng)該是:在調(diào)用exit之前已經(jīng)構(gòu)造但是尚未析構(gòu)的局部非靜態(tài)對(duì)象將再也不會(huì)被析構(gòu)。所以溫和自殺也要避免使用。
  綜上所述,最正經(jīng)、最靠譜的死法就是第一種:自然死亡。

  
析構(gòu)的順序
  那么,是不是只要讓進(jìn)程自然死亡就萬(wàn)事大吉了?非也!即使所有的類(lèi)對(duì)象都會(huì)被析構(gòu),還有另一個(gè)棘手的問(wèn)題:析構(gòu)的順序。先來(lái)看下面一個(gè)例子:


class CFoo
{
public:
  CFoo()
  {
    cout << "CFoo" << endl;
  }
  virtual ~CFoo()
  {
    cout << "~CFoo" << endl;
  }
};


  上述示例挺簡(jiǎn)單的(有效代碼僅6行),大伙兒能看出有什么問(wèn)題嗎?如果你一眼就看出問(wèn)題之所在,恭喜你,后面的內(nèi)容你不用看了。
  對(duì)于用戶定義的全局對(duì)象,在C++標(biāo)準(zhǔn)中并沒(méi)有規(guī)定它們構(gòu)造和析構(gòu)的先后順序;對(duì)于諸如標(biāo)準(zhǔn)輸入輸出流的coutcerr等全局對(duì)象,在C++ 03標(biāo)準(zhǔn)中(參見(jiàn)27.4.2.1.6章節(jié))有提及如何保證它們?cè)谧詈笪鰳?gòu)。但由于某些老式編譯器并未完全遵照標(biāo)準(zhǔn)實(shí)現(xiàn),導(dǎo)致標(biāo)準(zhǔn)輸入輸出流的幾個(gè)全局對(duì)象也可能被提前析構(gòu)。
  基于上述原因,假如CFoo類(lèi)也定義了一個(gè)全局對(duì)象g_foo。當(dāng)g_foo析構(gòu)的時(shí)候,cout對(duì)象可能已經(jīng)先死了(取決于具體的環(huán)境,詳見(jiàn)關(guān)于標(biāo)準(zhǔn)輸入輸出流的進(jìn)一步探討)。在這種情況下,CFoo析構(gòu)函數(shù)的打印語(yǔ)句由于引用了已死的對(duì)象,可能會(huì)導(dǎo)致不可預(yù)料的后果。
  從上面的例子可以看出,如果你在程序中使用了全局對(duì)象或者靜態(tài)對(duì)象,那你要非常小心地編寫(xiě)相關(guān)class/struct的析構(gòu)函數(shù)代碼,盡量不要在它們的析構(gòu)函數(shù)中引用其它的全局對(duì)象或靜態(tài)對(duì)象。當(dāng)然啦,假如能避免使用全局對(duì)象和靜態(tài)對(duì)象,就更好了。
  另外,在C++經(jīng)典名著《Modern C++ Design》的第6章詳細(xì)描述了關(guān)于單鍵(Singleton)銷(xiāo)毀的一些細(xì)節(jié)、場(chǎng)景及解決方法。大伙兒可以去拜讀一下。
  下一個(gè)帖子,會(huì)聊一下和線程有關(guān)的C++對(duì)象是怎么死的


追求原創(chuàng),歡迎轉(zhuǎn)載。
轉(zhuǎn)載必須包含本聲明、保持本文完整。并以超鏈形式注明作者編程隨想和本文原始地址:
http://program-think.blogspot.com/2009/02/cxx-object-destroy-with-process.html

 

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)提供的線程APIPOSIX平臺(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ù)(比如ACEBoost等),對(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)稱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)?span lang="EN-US">OS API
作為操作系統(tǒng)本身提供的API函數(shù),它被設(shè)計(jì)為語(yǔ)言無(wú)關(guān)的。它們不光可以被C++調(diào)用,還可以被其它諸如VBPythonDelphi等開(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ù)(比如MFCAfxBeginThread),這些函數(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ù)(以下稱為線程函數(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)文檔:http://msdn.microsoft.com/en-us/library/hw264s73.aspx。上面說(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è)?span lang="EN-US">Windows
上開(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)話題。


轉(zhuǎn)載必須包含本聲明、保持本文完整。并以超鏈接形式注明作者編程隨想和本文原始地址:
http://program-think.blogspot.com/2009/03/cxx-object-destroy-with-thread-win32.html

 

posted on 2009-03-06 23:27 肥仔 閱讀(640) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++ 基礎(chǔ)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久婷婷麻豆| 欧美与黑人午夜性猛交久久久| 麻豆9191精品国产| 久久久久免费视频| 蜜桃久久精品乱码一区二区| 葵司免费一区二区三区四区五区| 久久中文久久字幕| 女同性一区二区三区人了人一| 久久中文字幕一区二区三区| 免费成人激情视频| 国产精品jizz在线观看美国 | 亚洲国产成人91精品| 91久久精品久久国产性色也91| 日韩亚洲欧美一区二区三区| 亚洲欧美日韩精品久久久久| 玖玖玖免费嫩草在线影院一区| 亚洲二区免费| 亚洲无线视频| 久久精品在线视频| 欧美激情视频在线播放| 国产免费观看久久| 亚洲美女视频在线免费观看| 久久国产视频网站| 91久久精品一区二区三区| 亚洲一区二区日本| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品电影网站| 亚洲人成网站在线播| 久久av红桃一区二区小说| 最新日韩中文字幕| 久久精品成人一区二区三区| 欧美日本国产一区| 亚洲国产片色| 久久视频在线看| 亚洲天堂网在线观看| 欧美黄色aa电影| 亚洲国产精品第一区二区| 欧美在线日韩| 亚洲午夜激情| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 久久精品国产精品亚洲综合 | 欧美一区久久| 欧美日韩大片| 在线精品视频一区二区三四| 亚洲女优在线| 亚洲毛片网站| 欧美日韩精品一区视频| 亚洲高清网站| 美女诱惑一区| 久久九九热re6这里有精品| 国产精品一区二区你懂得| 一本到12不卡视频在线dvd| 欧美jizzhd精品欧美巨大免费| 欧美在线免费播放| 国产综合自拍| 久久久人成影片一区二区三区观看| 亚洲性视频网站| 国产精品外国| 久久国产精品久久精品国产| 亚洲在线视频免费观看| 国产精品久久久久久久久久免费看| 日韩一级在线| 日韩视频不卡中文| 欧美色另类天堂2015| 亚洲桃色在线一区| 一区二区三区久久网| 国产精品成人一区| 久久精品国产第一区二区三区| 亚洲欧美日韩国产综合| 国产手机视频精品| 开心色5月久久精品| 久久久人成影片一区二区三区| 亚洲成人原创| 亚洲国产精品专区久久| 欧美激情综合网| 一区二区三区久久| 亚洲免费中文字幕| 狠狠网亚洲精品| 亚洲第一色在线| 欧美视频在线不卡| 久久久噜噜噜久噜久久| 免费美女久久99| 亚洲性人人天天夜夜摸| 亚洲综合好骚| 亚洲国产精品www| 一区二区三区高清在线观看| 国产老女人精品毛片久久| 免费亚洲电影在线| 欧美性猛交99久久久久99按摩| 久久不射电影网| 欧美成人高清| 久久成人免费| 欧美日韩成人一区二区| 久久久久久久性| 欧美日韩精品是欧美日韩精品| 亚洲一区久久久| 国产精品久久久久一区| 欧美一级视频免费在线观看| 欧美一区二区三区喷汁尤物| 亚洲丰满在线| 亚洲一区免费网站| 亚洲国产欧美日韩精品| 亚洲视频在线观看三级| 亚洲激情国产精品| 亚洲一区二区三区久久| 91久久精品国产91性色tv| 亚洲欧美国产77777| 99国产一区二区三精品乱码| 欧美一区免费视频| 这里只有精品视频在线| 久久婷婷麻豆| 欧美一区二区视频观看视频| 欧美日本网站| 亚洲国产婷婷综合在线精品 | 亚洲午夜一区二区| 亚洲精品视频一区二区三区| 欧美在线视频一区| 亚洲女性喷水在线观看一区| 欧美二区不卡| 欧美福利在线| 伊甸园精品99久久久久久| 亚洲天天影视| 亚洲欧美日韩一区| 国产精品qvod| 一区二区国产精品| 亚洲天堂成人在线视频| 欧美电影在线播放| 亚洲国产精品第一区二区三区| 极品av少妇一区二区| 亚洲欧美日韩中文在线制服| 亚洲一区日韩在线| 欧美视频日韩视频| 一区二区三区高清| 亚洲欧美综合v| 欧美性猛交xxxx免费看久久久| 亚洲欧洲日本mm| av不卡在线看| 欧美另类专区| 亚洲四色影视在线观看| 亚洲女与黑人做爰| 国产欧美日韩| 久久精品国产999大香线蕉| 久久亚洲色图| 亚洲区中文字幕| 欧美日韩mv| 亚洲免费小视频| 久久精品中文字幕一区| 国产一区美女| 免费观看欧美在线视频的网站| 猛男gaygay欧美视频| 亚洲电影中文字幕| 欧美激情一区在线| 一本久久知道综合久久| 欧美一二区视频| 韩国av一区二区三区四区| 久久精品视频导航| 亚洲国产精品成人一区二区 | 欧美华人在线视频| 亚洲人体1000| 欧美私人网站| 亚洲美女av在线播放| 亚洲第一精品在线| 亚洲理论电影网| 欧美日韩国产精品| 亚洲一区二区三区在线看| 欧美一区二区三区在线观看| 一区二区三区中文在线观看| 毛片一区二区三区| 日韩天堂在线视频| 久久精品国产精品| 亚洲精品自在久久| 国产精品日韩精品欧美在线| 久久精品国产亚洲一区二区| 亚洲观看高清完整版在线观看| 国产精品99久久久久久久久 | 欧美精品一区在线观看| 亚洲女爱视频在线| 欧美刺激性大交免费视频| 亚洲图中文字幕| …久久精品99久久香蕉国产| 国产精品wwwwww| 欧美69wwwcom| 午夜精品婷婷| 99视频超级精品| 欧美成人性网| 久久精品日产第一区二区| 日韩亚洲成人av在线| 国内久久精品| 国产精品多人| 欧美日本国产精品| 牛牛国产精品| 久久先锋影音av| 欧美一区二区三区啪啪| 在线视频亚洲| 日韩一级黄色av| 亚洲日本成人女熟在线观看| 牛牛影视久久网| 六月丁香综合| 老司机免费视频久久| 欧美在线视频在线播放完整版免费观看|