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

            Focus on ACE

            訂閱 ace-china
            電子郵件:
            瀏覽存于 groups.google.com 上的所有帖子

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              64 Posts :: 3 Stories :: 22 Comments :: 0 Trackbacks
            2006年06月30日

            關(guān)于ACE_Task::last_thread()

            在ACE應(yīng)用中,我們經(jīng)常用ACE_Task類實(shí)現(xiàn)多線程處理。由于ACE_Svc_Handler從ACE_Task派生,當(dāng)你寫的應(yīng)用程序使用了Acceptor-Connector框架同時(shí)又直接使用ACE_Task,如線程池,這時(shí)你會(huì)使用到ACE_Task。
            因?yàn)樵S多ACE_Task對(duì)應(yīng)是動(dòng)態(tài)分配的,所以,必須在不再需要時(shí)把它們正確地釋放掉,知道何時(shí)可以釋放對(duì)象,這一點(diǎn)非常重要。C++NPv2第189頁(yè)描述了當(dāng)多線程涉及到的task對(duì)象在它們退出時(shí),使用ACE_Task::thr_count()方法確定正確釋放它們的方法。

            在C++NPv2文檔中描述的過程并不不安全,這里有一個(gè)用例可以說明這一點(diǎn)。原因如下:

            ACE在調(diào)用ACE_Task::close()掛鉤(hook)函數(shù)前檢查線程計(jì)數(shù)。

            線程鎖(task thread)使控制線程計(jì)數(shù)順序化,所以不能通過調(diào)用ACE_Task::close()達(dá)到控制線程數(shù)這一目的,這是因?yàn)殛P(guān)閉掛勾(close hook)方法會(huì)刪除task 對(duì)象。因此,多個(gè)線程檢查ACE_Task:: thr_count()的值都為0是可能存在的。

            舉例來說吧,我們假設(shè)這里有兩個(gè)線程,A和B,這給都要退出。線程A從svc()方法中退出控制,同時(shí),ACE開始線程記錄保護(hù)(record-keeping)。ACE獲得線程鎖并把活動(dòng)線程數(shù)從2減為1,接著,ACE釋放線程鎖并調(diào)用task的close()掛鉤方法。其間,線程B也從svc()方法中退出。在線程A檢查ACE_Task::thr_count()之前,ACE已執(zhí)行線程B的清楚操作可能導(dǎo)致task的線程計(jì)數(shù)器從1變?yōu)?.如果那樣,線程A和B都會(huì)看到線程計(jì)數(shù)器為0,并都試圖清理task對(duì)象。這一點(diǎn)肯定不是好事.......

            發(fā)現(xiàn)并指出這一問題是一位長(zhǎng)時(shí)間使用ACE的用戶,Howard Finer,經(jīng)過一些迭代和試驗(yàn)Howard找到一個(gè)解決這一問題的辦法,即額外的維護(hù)線程計(jì)數(shù)器,記住到底是哪一個(gè)線程真實(shí)的把線程計(jì)數(shù)器從1變?yōu)?,(上述例子中的線程B)。這就要求ACE_Task增加一個(gè)新的方法 :
            ACE_thread_t ACE_Task::last_thread (void) const
            所以,在你的代碼實(shí)現(xiàn)ACE_Task::close()時(shí)需要包含如下的檢查

            if (ACE_OS::thr_equal (ACE_Thread::self (),
            ?????????????????????? this->last_thread ()))
            ? {
            ??? // Do the cleanup here...
            ? }


            這個(gè)方法可能會(huì)出現(xiàn)在ACE 5.5.2中。

            posted on 2006-06-30 12:30 Stone Jiang 閱讀(1374) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ACE
            国产精品久久久久影院嫩草 | 四虎亚洲国产成人久久精品| 久久国产色av免费看| 久久亚洲熟女cc98cm| 色婷婷久久久SWAG精品| 欧美性猛交xxxx免费看久久久| 久久久久亚洲精品男人的天堂| 欧美国产成人久久精品| 久久久久亚洲AV片无码下载蜜桃| 伊人久久大香线蕉亚洲| 国产精品无码久久综合| 国产2021久久精品| 天天做夜夜做久久做狠狠| 久久丫忘忧草产品| 国产亚洲精品美女久久久| 国产三级精品久久| 狠狠色丁香久久婷婷综合图片| 一本色道久久88精品综合| 久久国产色AV免费观看| 99久久国产免费福利| 一级a性色生活片久久无| 久久人妻少妇嫩草AV无码专区| 91久久精品国产成人久久| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 中文字幕热久久久久久久| 精品久久久久久久久午夜福利| 国产精品美女久久久久av爽| 久久亚洲国产成人影院| 久久青草国产精品一区| 色偷偷91久久综合噜噜噜噜| 国产精品无码久久久久久| 亚洲国产精品无码久久青草 | 久久中文字幕一区二区| 久久精品综合网| 99久久国产免费福利| 久久精品国产精品亚洲毛片| 深夜久久AAAAA级毛片免费看 | 99久久精品国产毛片| 久久精品毛片免费观看| 香蕉久久夜色精品国产尤物| 亚洲一本综合久久|