• <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>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            欲加速,故生并發(fā)之策,存臨界不可達(dá),故而生鎖,阻塞患于鎖,固又生避阻之策 ---- 轉(zhuǎn)

            欲加速,故生并發(fā)之策,存臨界不可達(dá),故而生,阻塞患于,固又生避阻之策。。。 此刻主要想記錄下關(guān)于并發(fā)中相關(guān)的內(nèi)容,當(dāng)然,我也只想記錄一些真正有效用的東西。 可以說是衍生自并發(fā),故談并發(fā)必然至。 此篇不欲從減少臨界區(qū)以提高并發(fā)度的角度來考慮,不會(huì)深度探索諸如如何基于CAS來構(gòu)建高質(zhì)量無數(shù)據(jù)結(jié)構(gòu)等。 而是從反方向,從如何很好的運(yùn)用策略的角度來考慮。 這里要強(qiáng)調(diào)的一點(diǎn)是,無論如何,臨界區(qū)一個(gè)系統(tǒng)中基本上是必然存的。CAS的確可以很多地方通過自身機(jī)制來消去以達(dá)到化解臨界區(qū)之目的。但是這個(gè)實(shí)現(xiàn)復(fù)雜度卻又著實(shí)提升了,況且,也不是所有地方都能夠或者值得去CAS。相比而言,比較容易理解。 好了,切入主題:并發(fā)之------策略! 好,首先是定界加策略。 定界加(Scoped Locking):能確保當(dāng)控制進(jìn)入到某一范圍時(shí),自動(dòng)獲得,而當(dāng)控制離開范圍時(shí),自動(dòng)釋放,不管從該范圍返回的路徑是什么。 給段普通的C++代碼sample: bool increment(const string &path) { Item *item = lookup_or_create(path); lock.acquire(); if(entry==0){ lock.release(); return false; } else { entry->increment_hit_count(); lock.release(); return true; } } 這段代碼完全可以正常工作,但是lock.acquire()和lock.release()之間存著多路返回,如果以上情況復(fù)雜點(diǎn),寫代碼的人不一定記得每個(gè)返回點(diǎn)都釋放。OK, 就算情況不復(fù)雜,拿上面的例子來看,如果entry->increment_hit_count()拋出了個(gè)異常,那如何???很顯然,得不到釋放了,這顯然會(huì)導(dǎo)致其它想要得到的線程永遠(yuǎn)阻塞。 那怎么樣避免呢?定界加模式是正用于此。 你可以定義個(gè)哨兵類(guard)類,當(dāng)控制進(jìn)入一個(gè)區(qū)域時(shí),哨兵類的構(gòu)造函數(shù)自動(dòng)獲得一個(gè),當(dāng)控制離開這個(gè)區(qū)域時(shí),哨兵類的析構(gòu)函數(shù)自動(dòng)釋放該,因?yàn)楦鶕?jù)C++的語義,即便程序中拋出一個(gè)異常,析構(gòu)函數(shù)還是會(huì)執(zhí)行。將哨兵類實(shí)例化,以定義臨界區(qū)的方法和塊區(qū)域中獲得或釋放。類似于autoPoint的手法,需要注意的是:一,哨兵類中要使用指向的指針而不是使用棧上對(duì)象,以防止對(duì)的復(fù)制或賦值;二,給哨兵類增加一個(gè)owner標(biāo)志,用來表示哨兵是否成功獲得了,該標(biāo)志也可以指示當(dāng)錯(cuò)誤地使用靜態(tài)/全局時(shí),由“初始化錯(cuò)誤”而導(dǎo)致的失敗。通過析構(gòu)函數(shù)中檢查這個(gè)標(biāo)志,可以避免當(dāng)哨兵釋放它并不擁有的而產(chǎn)生的運(yùn)行時(shí)錯(cuò)誤。 哨兵類代碼示范: class Thread_Mutex_Gurad { public: Thread_Mutex_Guard(Thread_Mutex &lock):lock_(&lock), owner_ (false){ lock_->acquire(); owner_ = true; } ~Thread_Mutex_Guard(){ if(owner_) lock_->release(); } private: Thread_Mutex *lock_; bool owner_; Thread_Mutex_Guard(const Thread_Mutex_Guard &); void operator=(const Thread_Mutex_Guard &); }; 以上模式是基于C++的特性來玩的。C++棧對(duì)象離開作用域時(shí),必然調(diào)用其析構(gòu),這是死規(guī)則,所以這樣OK。 再拿java作下對(duì)比,如果使用synchronized關(guān)鍵字,OK,你不用理會(huì)上面的麻煩,JVM幫你搞定。但如果你用的是 ReentrantLock或者ReadWriteLock之類,那么,下面的寫法基本上就是死規(guī)矩了。 lock.lock(); try{ } finally{ lock.unlock(); } 以上代碼不能顯示獲取和釋放,你可以很簡單的給它加上。 現(xiàn)懶得寫東西了,下文后續(xù)補(bǔ)上。。。。。。 java下也有個(gè)finalize方法來做實(shí)例的資源銷毀,但是JVM作GC的時(shí)機(jī)不確定,并非對(duì)象離開作用域就立馬調(diào)用。所以你不要拿java的對(duì)豍

            posted on 2008-11-07 21:36 大龍 閱讀(288) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            精品欧美一区二区三区久久久| 欧美精品福利视频一区二区三区久久久精品 | 久久av高潮av无码av喷吹| 久久青青草原综合伊人| 日韩久久久久中文字幕人妻| 亚洲精品无码久久久久sm| 国产精品一久久香蕉产线看| 一本大道久久香蕉成人网| 色综合久久久久综合体桃花网| 精品亚洲综合久久中文字幕| 久久久综合香蕉尹人综合网| 伊人久久大香线蕉综合影院首页| 91久久精品国产成人久久| 免费精品国产日韩热久久| 大美女久久久久久j久久| 久久亚洲国产成人精品性色| 四虎亚洲国产成人久久精品| 热re99久久精品国产99热| 99久久成人国产精品免费 | 精品伊人久久大线蕉色首页| 国产精品久久久天天影视| 精品蜜臀久久久久99网站| 久久青草国产手机看片福利盒子 | 国产午夜久久影院| 久久无码av三级| 久久久久久国产精品无码下载 | 欧美激情一区二区久久久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久九九久精品国产| 国产韩国精品一区二区三区久久| 精品多毛少妇人妻AV免费久久 | 中文字幕无码精品亚洲资源网久久| 亚洲国产成人久久综合一区77| 亚洲国产精品一区二区久久hs| 色综合久久无码五十路人妻| 国产精品久久久天天影视| 手机看片久久高清国产日韩| 东京热TOKYO综合久久精品| 国产亚洲精久久久久久无码AV| 青青久久精品国产免费看| 天堂久久天堂AV色综合|