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

C++ Programmer

天行健,君子以自強(qiáng)不息; 地勢坤,君子以厚德載物

多線程中局部靜態(tài)變量初始化的陷阱

    C++當(dāng)中常常需要一個全局唯一的對象實(shí)例,這時候,我們就會想到單件模式。如何實(shí)現(xiàn)這一模式?全局變量當(dāng)然是一個簡單可行的方法,然而,這太丑陋。嗯,其實(shí),丑陋倒也罷了,最嚴(yán)重的是它將引誘程序員濫用全局變量,這將導(dǎo)致維護(hù)的災(zāi)難。

    既然全局變量是可能有害的,那么,我們我們把它隱藏一下,放到某個類當(dāng)中去,作為類的靜態(tài)數(shù)據(jù)成員。這看上去不錯,我也這么認(rèn)為。當(dāng)我們只是簡單的需要一個全局對象時,這很好,而且足夠簡單。不過,天空中尚有一朵小小的烏云,讓我們來看一看它是什么。

    靜態(tài)成員變量的初始化,和全局對象一樣,實(shí)際上是在main函數(shù)進(jìn)入后,我們寫下的第一行代碼之前被執(zhí)行的。而且,我們知道那個著名的初始化順序不可靠的問題(跨編譯單元)。當(dāng)我的全局對象是一個復(fù)雜對象――這很常見,比如一個環(huán)境管理器――它甚至還需要復(fù)雜的裝配過程,我們需要考慮:構(gòu)建這個單件的時候,其對象都準(zhǔn)備好了嗎?如果我們不能確定,那么一個常見的措施是延遲單件對象的構(gòu)造――把它延遲到全局對象初始化結(jié)束以后怎么樣?這好像很容易實(shí)現(xiàn):

SomeClass * SomeClass ::instance()
 
static SomeClass inst;
 
return &inst;
}

不錯吧?它不但可以延遲到全局對象初始化之后,甚至可以延遲到有人需要它的時候,才被構(gòu)造出來,隨需應(yīng)變,呵呵,是不是很帥?嗯,還有一點(diǎn)小問題,不僅存在對象初始化順序問題,析構(gòu)也同樣存在問題。局部靜態(tài)變量的析構(gòu),和全局對象一樣,是在main函數(shù)退出前進(jìn)行的,如果也要考慮順序問題的話...是不是有點(diǎn)麻煩呢?

    過度設(shè)計是一種罪,我是不是考慮的太復(fù)雜了?如果壓根就不需要考慮析構(gòu)順序,這是不是很完美的解決方案?沒那么簡單!非但不夠完美,而且,這里面仍然存在缺陷:當(dāng)我們運(yùn)行在多線程環(huán)境的時候,靜態(tài)變量的初始化來實(shí)現(xiàn)單件,是不可靠的――直接的說,靜態(tài)變量有可能初始化多次!在作實(shí)驗(yàn)之前,我們現(xiàn)分析一下靜態(tài)局部變量的實(shí)現(xiàn)方式,下面是前面instance實(shí)現(xiàn)的偽碼:

if (!initialized){
 initialized 
= true;
 
new (&inst)SomeClass;
}

return &inst;

每個靜態(tài)變量都會擁有自己的初始化與否的標(biāo)志,靜態(tài)變量初始化并不是一個原子操作,也沒有為多線程而設(shè)立互斥區(qū)(C++語言本身是沒有線程概念的),因此,我們要想實(shí)現(xiàn)多線程下的單件延遲創(chuàng)建,就不得不解決重復(fù)初始化的問題。至于如何實(shí)現(xiàn),實(shí)際上這方面的代碼很多了。一個顯然的方案是設(shè)立互斥區(qū),傳統(tǒng)的雙檢測技術(shù)可以有效解決這一問題――至少目前的C++是這樣,至于最近在csdn看到在Java中雙檢測失效的文章,我認(rèn)為應(yīng)該由Java語言負(fù)責(zé)。

    其實(shí),局部靜態(tài)變量可能多次初始化,并不難理解,實(shí)踐上,也很少出嚴(yán)重的問題――出問題的條件還是挺苛刻的:多線程,不可多次初始化,恰好多個線程同時調(diào)用,恰好在if之后發(fā)生線程調(diào)度。很少出問題,不等于不出問題,特別的,對于廣泛使用的應(yīng)用程序來說,出錯概率就不是一點(diǎn)點(diǎn)了。寫這篇東西的原因,是今天在公司看到的一段代碼,作了標(biāo)識符替換:

SomeClass * SomeClass::GetInstance(){
 
static CLock g_lock;
 
if (m_pInstance == NULL){
  g_lock.Lock();
  
if (m_pInstance == NULL){
   m_pInstance 
= new SomeClass;
  }

  g_lock.Unlock();
 }

 
return m_pInstance;
}

就這段代碼,雖然知道用雙檢測,且不說Lock/Unlock可以更好的處理,static CLock g_lock根本就是錯誤。鎖本身可能被初始化多次,象這種資源類型的對象,多次構(gòu)造幾乎肯定會出錯的。而對于單件模式的實(shí)現(xiàn),我認(rèn)為,一般而言,Loki:: SingletonHolder會是一個好的選擇。

 

本文出處:http://blog.csdn.net/wingfiring/archive/2005/10/09/498242.aspx

posted on 2009-07-24 10:47 Saga 閱讀(4703) 評論(0)  編輯 收藏 引用 所屬分類: MultiTask

導(dǎo)航

<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

統(tǒng)計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产伦精品免费视频| 亚洲片在线观看| 国产尤物精品| 国产美女精品免费电影| 欧美午夜电影在线| 国产精品视频1区| 国产日韩欧美中文| 伊人一区二区三区久久精品| 亚洲国产精品ⅴa在线观看| 亚洲精品免费一二三区| 亚洲视频久久| 久久aⅴ国产欧美74aaa| 国产在线精品自拍| 免费亚洲电影在线| 久久9热精品视频| 久久九九免费视频| 欧美韩日一区二区| 中日韩美女免费视频网址在线观看 | 国产女主播一区二区| 国模吧视频一区| 99视频一区| 久久亚洲高清| 一区二区三区视频免费在线观看| 久久精品99久久香蕉国产色戒| 日韩亚洲综合在线| 91久久黄色| 欧美成人日韩| 国产亚洲激情在线| 日韩视频免费| 亚洲国产99精品国自产| 欧美一区二区久久久| 欧美激情aⅴ一区二区三区| 国产午夜精品全部视频在线播放| 亚洲欧洲一区二区三区在线观看| 欧美专区亚洲专区| 先锋影音国产精品| 中文在线资源观看视频网站免费不卡| 欧美日韩综合视频网址| 亚洲欧美日韩国产一区二区| 久久精视频免费在线久久完整在线看| 欧美粗暴jizz性欧美20| 狠狠色丁香婷婷综合| 99精品久久免费看蜜臀剧情介绍| 久久精品99久久香蕉国产色戒| 亚洲成人资源| 久久成人免费日本黄色| 国产精品最新自拍| 亚洲一区二区三区欧美| 亚洲日本一区二区三区| 欧美v日韩v国产v| 尤物精品国产第一福利三区| 欧美呦呦网站| 亚洲天堂第二页| 欧美日韩精品一区二区三区| 亚洲精品三级| 亚洲国产欧美一区| 男人天堂欧美日韩| 亚洲国产精品va在线看黑人 | 一区二区电影免费观看| 久久免费国产| 午夜亚洲福利| 国产精品入口夜色视频大尺度| 亚洲视频电影图片偷拍一区| 亚洲免费av电影| 欧美日韩色婷婷| 亚洲午夜精品久久久久久浪潮 | 久久久久久网站| 亚洲欧美一区二区三区极速播放 | 亚洲精品乱码久久久久久日本蜜臀| av成人天堂| 一区二区三区在线免费视频 | 日韩一级在线观看| 亚洲精选在线观看| 国产精品大片| 久久精品中文字幕一区二区三区| 久久福利毛片| 亚洲青涩在线| 亚洲夜间福利| 国内精品免费午夜毛片| 欧美成人xxx| 欧美体内she精视频| 欧美中文字幕第一页| 久久夜色精品国产欧美乱| 亚洲日本一区二区三区| 一区二区黄色| 精品999久久久| 亚洲精品国产视频| 国产亚洲欧美色| 91久久线看在观草草青青| 国产精品美女久久久久久2018| 久久精品视频在线看| 你懂的视频欧美| 欧美伊人久久久久久久久影院| 久久久久久综合| 亚洲自拍另类| 久久综合久久综合久久| 亚洲女女女同性video| 久久久精品国产免大香伊| 一区二区三区不卡视频在线观看 | 国产综合久久久久久| 亚洲国产91精品在线观看| 亚洲一区二区免费在线| 国产午夜精品一区二区三区欧美 | 日韩香蕉视频| 99精品国产99久久久久久福利| 国产精品九九| 91久久久久久久久| 国产三区二区一区久久 | 午夜伦欧美伦电影理论片| 亚洲国产精品久久久久久女王 | 可以免费看不卡的av网站| 在线亚洲电影| 久久综合网hezyo| 欧美伊久线香蕉线新在线| 欧美精品一区二区三区在线看午夜| 欧美中在线观看| 欧美日韩免费精品| 久久久久久久波多野高潮日日| 欧美激情第一页xxx| 欧美伦理视频网站| 久久综合伊人77777麻豆| 国产精品二区在线观看| 亚洲人成在线播放| 伊伊综合在线| 性亚洲最疯狂xxxx高清| 亚洲欧美日韩一区二区三区在线| 欧美成在线视频| 欧美国产日本在线| 在线观看日韩av电影| 欧美一区二区在线免费播放| 西瓜成人精品人成网站| 国产精品va在线播放我和闺蜜| 亚洲日本免费| 国产精品99久久久久久人| 欧美欧美午夜aⅴ在线观看| 欧美激情一区二区三区不卡| 亚洲成人资源| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久青草福利网站| 激情久久影院| 浪潮色综合久久天堂| 亚洲第一级黄色片| 亚洲精选在线观看| 欧美日韩精品福利| 一区二区激情小说| 欧美伊人久久久久久久久影院| 国产精品福利在线| 午夜免费久久久久| 久久女同精品一区二区| 在线观看亚洲视频啊啊啊啊| 老司机午夜精品视频| 亚洲经典三级| 亚洲在线一区二区| 国产麻豆综合| 久久精品天堂| 亚洲成人自拍视频| 亚洲影视在线| 韩日欧美一区| 欧美久久电影| 亚洲男人的天堂在线aⅴ视频| 久久不射2019中文字幕| 亚洲第一天堂av| 久久综合狠狠综合久久激情| 一色屋精品视频在线看| 久久免费国产精品| 亚洲国产清纯| 欧美亚男人的天堂| 久久精品一本| 亚洲欧洲在线视频| 午夜精品在线观看| 亚洲丰满在线| 国产精品每日更新| 麻豆国产精品一区二区三区| 99国产精品久久久久久久成人热| 欧美中文字幕在线| 99热这里只有精品8| 国内成+人亚洲+欧美+综合在线| 欧美顶级大胆免费视频| 午夜免费日韩视频| 亚洲免费播放| 欧美.www| 久久国产主播| 亚洲小说春色综合另类电影| 狠狠做深爱婷婷久久综合一区| 欧美日韩99| 久久婷婷国产综合精品青草| 国产女精品视频网站免费| 亚洲欧洲一区二区三区久久| 国产亚洲高清视频| 亚洲私人影院在线观看| 国产免费成人av| 久久国内精品视频| 亚洲乱码国产乱码精品精98午夜| 久久精品国产精品亚洲精品| 一本色道久久| 亚洲国产成人porn| 国产日韩av高清| 国产精品swag| 欧美日韩亚洲综合一区| 欧美成人第一页|