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

posts - 9,  comments - 19,  trackbacks - 0
本人博客地址:http://m.shnenglu.com/pwq1989/ 


今天群里姐夫推薦了個(gè)C++的Actor框架 Theron,就看了下源碼,注釋比代碼還多,業(yè)界良心。

源碼我還沒看完,就看到了他的一個(gè)叫StringPool的類,里面通過Ref來生成單例(Singleton),看了下
static void Reference();這個(gè)函數(shù)實(shí)現(xiàn)的時(shí)候,突然腦洞一開,為啥沒有Memory Barrier(wiki)。

先貼一下他的代碼:
 1 StringPool *StringPool::smInstance = 0;
 2 Mutex StringPool::smReferenceMutex;
 3 uint32_t StringPool::smReferenceCount = 0;
 4 
 5 
 6 void StringPool::Reference()
 7 {
 8     Lock lock(smReferenceMutex);
 9 
10     // Create the singleton instance if this is the first reference.
11     if (smReferenceCount++ == 0)
12     {
13         IAllocator *const allocator(AllocatorManager::GetCache());
14         void *const memory(allocator->AllocateAligned(sizeof(StringPool), THERON_CACHELINE_ALIGNMENT));
15         smInstance = new (memory) StringPool();
16     }
17 }

我們先不討論這一段代碼,先看看下面的:

大家如果看過C++的Double Check Lock不可靠的這篇paper(地址),作者給出的解決方案是這樣的:
 1     // First check
 2     TYPE* tmp = instance_;
 3     // Insert the CPU-specific memory barrier instruction
 4     // to synchronize the cache lines on multi-processor.
 5     asm ("memoryBarrier");
 6     if (tmp == 0) {
 7         // Ensure serialization (guard
 8         // constructor acquires lock_).
 9         Guard<LOCK> guard (lock_);
10         // Double check.
11         tmp = instance_;
12         if (tmp == 0) {
13                 tmp = new TYPE;
14                 // Insert the CPU-specific memory barrier instruction
15                 // to synchronize the cache lines on multi-processor.
16                 asm ("memoryBarrier");
17                 instance_ = tmp;
18         }
19     return tmp;

其實(shí)這兩個(gè)Memory Barrier不用全屏障,第一個(gè)用讀屏障rmb()就好了。第二個(gè)需要一個(gè)寫屏障wmb()。

我們都知道m(xù)b這個(gè)東西是為了防止CPU級(jí)別的指令亂序被發(fā)明出來的,(另一個(gè)是編譯器級(jí)別的,和本篇文章沒有多大關(guān)系,有興趣大家可以去研究下),實(shí)現(xiàn)也是由平臺(tái)相關(guān)的特殊指令(mfence這樣的)組成的。

之所以要寫成這樣,第二個(gè)mb()是為了防止在構(gòu)造函數(shù)完成之前提前對(duì)目標(biāo)賦值,但ctor還沒完成,就被掛起,然后第二個(gè)線程訪問的時(shí)候,認(rèn)為已經(jīng)構(gòu)造完畢,進(jìn)而使用不完整的數(shù)據(jù)引發(fā)奇怪的錯(cuò)誤。

(第一個(gè)rmb()的作用我覺得是可有可無,加上可能是為了效率把(猜),強(qiáng)制刷新讀取instance_的值,防止進(jìn)入第一個(gè)check去競爭那個(gè)鎖,不加也是不會(huì)有錯(cuò)的,因?yàn)镻OSIX規(guī)定mutex之間必須保持內(nèi)存的可見性,所以是不需要擔(dān)心讀到臟數(shù)據(jù)) <-- 這段是個(gè)人意見,歡迎修正。

下面就是我趴了半下午才想明白的問題。。。為啥Theron中那段代碼(第一段代碼)不需要在lock中添加mb(),后來往下翻了下,發(fā)現(xiàn)StringPool的構(gòu)造函數(shù)是空的。。根本就沒有內(nèi)存的寫入,當(dāng)然就不需要wmb()了。


可見,C++的多線程編程,好難
posted on 2014-01-08 00:54 右席 閱讀(5064) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 搬磚之路
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧洲一区| 亚洲国产毛片完整版 | 欧美一区二区三区在线| 国产精品区二区三区日本 | 一区二区三区视频在线观看| 99视频精品在线| 国产欧美精品在线播放| 久久久蜜桃精品| 久久亚洲春色中文字幕久久久| 亚洲激情视频网| 99在线热播精品免费| 国产日产亚洲精品系列| 欧美1区2区3区| 欧美色图一区二区三区| 久久精品亚洲乱码伦伦中文 | 亚洲欧美日韩天堂| 亚洲国产欧美在线| 亚洲无玛一区| 极品尤物久久久av免费看| 男同欧美伦乱| 欧美电影专区| 欧美亚洲一区二区三区| 久热re这里精品视频在线6| 亚洲图片欧洲图片日韩av| 小黄鸭精品密入口导航| 99精品国产福利在线观看免费| 日韩午夜电影在线观看| 国产亚洲制服色| 亚洲精品乱码久久久久久日本蜜臀| 国产精品日韩精品| 亚洲人久久久| 伊人久久亚洲影院| 亚洲女人小视频在线观看| 亚洲国产精品一区二区www| 亚洲一区二区三区在线| 亚洲精选在线| 久久亚洲风情| 久久免费少妇高潮久久精品99| 欧美日韩国产麻豆| 欧美激情二区三区| 韩国一区二区三区美女美女秀| 日韩一区二区高清| 亚洲精品孕妇| 免播放器亚洲一区| 久久亚洲欧美| 国产一区二区三区成人欧美日韩在线观看| 亚洲人成在线观看一区二区| 精品成人免费| 欧美一区二区观看视频| 午夜精品国产| 国产精品久久久久77777| 亚洲精品免费一区二区三区| 亚洲黄网站在线观看| 久久精品亚洲精品| 狼狼综合久久久久综合网| 国产精品视频大全| 亚洲一区网站| 欧美在线三区| 国产亚洲精品v| 欧美在线一级va免费观看| 久久国产欧美日韩精品| 国产一区二区三区在线观看视频| 在线一区亚洲| 欧美亚洲午夜视频在线观看| 国产精品久久午夜| 亚洲欧美日韩中文视频| 久久精品久久99精品久久| 国产一区二区三区在线观看精品 | 欧美高潮视频| 亚洲精品网站在线播放gif| 最新国产拍偷乱拍精品| 欧美高清视频www夜色资源网| 欧美激情一区二区在线 | 一区二区三区日韩在线观看| 另类亚洲自拍| 国产区欧美区日韩区| 亚洲天堂激情| 亚洲视频在线观看三级| 欧美视频二区36p| 亚洲一区www| 久久成人综合网| 国产一区在线播放| 欧美成熟视频| 中文欧美在线视频| 久久久久久免费| 亚洲激情网址| 国产精品九九| 久久久久国产一区二区三区| 亚洲国产精品黑人久久久| 亚洲图色在线| 激情自拍一区| 欧美视频精品在线观看| 欧美尤物巨大精品爽| 亚洲国产cao| 国产精品久久97| 在线观看日韩| 欧美xxxx在线观看| 亚洲男同1069视频| 亚洲电影天堂av| 亚洲一级黄色av| 国产在线观看一区| 欧美日韩一区国产| 久久久蜜臀国产一区二区| 亚洲剧情一区二区| 欧美自拍偷拍午夜视频| 亚洲精品一二三区| 国产一区视频在线观看免费| 欧美乱大交xxxxx| 欧美在线国产| 亚洲视频第一页| 亚洲第一主播视频| 久久久国产一区二区| 国产精品99久久久久久久久久久久 | 日韩网站在线观看| 国产主播一区二区三区四区| 久久精品国产一区二区电影 | 久久久久久一区二区三区| 99视频一区二区| 亚洲高清毛片| 韩国在线一区| 国产精品日日摸夜夜摸av| 欧美精品色网| 免费一级欧美在线大片| 久久国产精品一区二区| 亚洲在线播放电影| 一区二区欧美亚洲| 亚洲裸体视频| 欧美激情中文字幕乱码免费| 美女诱惑黄网站一区| 久久黄色影院| 久久精品综合| 久久一区二区三区av| 久久久夜夜夜| 久久久激情视频| 欧美综合国产| 久久精品在线| 麻豆久久婷婷| 另类酷文…触手系列精品集v1小说| 午夜一区二区三视频在线观看| 亚洲伊人久久综合| 亚洲五月婷婷| 亚洲一区二区三区在线播放| 一区二区三区产品免费精品久久75 | 欧美亚洲一区二区在线| 午夜综合激情| 欧美伊人久久久久久久久影院| 午夜影院日韩| 久久久亚洲国产美女国产盗摄| 久久久国产亚洲精品| 久久久亚洲高清| 欧美国产成人在线| 欧美日韩综合一区| 国产精品一区免费在线观看| 国产精品久久久久久久久久ktv | 亚洲天堂av在线免费观看| 亚洲影院在线| 欧美在线黄色| 嫩草国产精品入口| 亚洲韩国精品一区| 一区二区三区四区五区精品视频| 亚洲视频在线一区| 欧美淫片网站| 欧美ed2k| 国产精品久久77777| 国产亚洲午夜| 亚洲三级电影全部在线观看高清| 一区二区日韩伦理片| 欧美一区在线视频| 欧美高清在线精品一区| 一区二区91| 久久在线视频| 欧美精品一区二区精品网 | 国产精品久久久久9999高清| 一区二区三区在线观看国产| 亚洲卡通欧美制服中文| 香蕉久久a毛片| 亚洲电影免费在线| 香蕉成人啪国产精品视频综合网| 久久亚洲综合色一区二区三区| 欧美日韩国产精品一区二区亚洲| 国产欧美一区二区精品秋霞影院| 亚洲国产成人午夜在线一区| 午夜精品久久| 亚洲人成艺术| 久久视频在线免费观看| 国产精品久久久久久一区二区三区| 好男人免费精品视频| 亚洲欧美精品在线| 亚洲第一区色| 久久精品国产清自在天天线| 欧美日韩精品在线| 亚洲国产免费| 久久久一区二区| 亚洲午夜一区二区三区| 欧美顶级少妇做爰| 在线欧美小视频| 久久九九精品| 亚洲一本大道在线| 欧美三级视频| 夜色激情一区二区|