• <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>
            隨筆-167  評(píng)論-8  文章-0  trackbacks-0

            鎖類屬包含的類包裝簡(jiǎn)單的鎖定機(jī)制,比如互斥體、信號(hào)量、讀/寫(xiě)互斥體和令牌等。這里我就以互斥體為例簡(jiǎn)單的介紹一下其使用方法,對(duì)其它的鎖類進(jìn)行一些簡(jiǎn)單的說(shuō)明。

            1.互斥體的使用。

            互斥體用于保護(hù)共享的易變代碼,也就是全局或靜態(tài)數(shù)據(jù)。這樣的數(shù)據(jù)必須通過(guò)互斥體進(jìn)行保護(hù),以防止它們?cè)诙鄠€(gè)線程同時(shí)訪問(wèn)時(shí)損壞。

            在ACE中可以通過(guò)ACE_Thread_Mutex實(shí)現(xiàn)線程的訪問(wèn)互斥,下面的例子演示ACE_Thread_Mutex類的使用。

            #include "ace/Thread.h" 
            #include 
            "ace/Synch.h" 

            #include 
            <iostream>
            using namespace std;


            ACE_Thread_Mutex mutex;

            void* Thread1(void *arg) 
            {
                mutex.acquire();
                ACE_OS::sleep(
            3);
                cout
            <<endl<<"hello thread1"<<endl;
                mutex.release();

                
            return NULL; 
            }
             

            void* Thread2(void *arg) 
            {
                mutex.acquire();
                cout
            <<endl<<"hello thread2"<<endl;
                mutex.release();

                
            return NULL; 
            }
             

            int main(int argc, char *argv[]) 

                ACE_Thread::spawn((ACE_THR_FUNC)Thread1);
                
                
            //Thread2 比Thread1晚創(chuàng)建1秒鐘,故后嘗試獲取互斥體
                ACE_OS::sleep(1);
                ACE_Thread::spawn((ACE_THR_FUNC)Thread2);
                
                
            while(true)
                    ACE_OS::sleep(
            10);

                
            return 0
            }
             

            ACE_Thread_Mutex主要有兩個(gè)方法:

            1. acquire():用來(lái)獲取互斥體,如果無(wú)法獲取,將阻塞至獲取到為止。
            2. release():用來(lái)釋放互斥體,從而使自己或者其它線程能夠獲取互斥體。

            當(dāng)線程要訪問(wèn)共享資源時(shí),首先調(diào)用acquire()方法獲取互斥體,從而獲取對(duì)改互斥體所保護(hù)的共享資源的唯一訪問(wèn)權(quán)限,訪問(wèn)結(jié)束時(shí)調(diào)用釋放互斥體,使得其它線程能獲取共享資源的訪問(wèn)權(quán)限。

            在此例中,本來(lái)Thread2的打印消息在Thread1之前,但由于Thread1先獲得互斥體,故Thread2只有待Thread1結(jié)束后才能進(jìn)入臨界區(qū)。讀者朋友們可以通過(guò)將ACE_Thread_Mutex替換為ACE_NULL_Mutex看一下不加鎖的執(zhí)行結(jié)果。

            2.ACE Lock類屬簡(jiǎn)介。

            ACE Lock類屬列表如下:

            名字

            描述

            ACE_Mutex

            封裝互斥機(jī)制(根據(jù)平臺(tái),可以是mutex_t、pthread_mutex_t等等)的包裝類,用于提供簡(jiǎn)單而有效的機(jī)制來(lái)使對(duì)共享資源的訪問(wèn)序列化。它與二元信號(hào)量(binary semaphore)的功能相類似。可被用于線程和進(jìn)程間的互斥。

            ACE_Thread_Mutex

            可用于替換ACE_Mutex,專用于線程同步。

            ACE_Process_Mutex

            可用于替換ACE_Mutex,專用于進(jìn)程同步。

            ACE_NULL_Mutex

            提供了ACE_Mutex接口的"無(wú)為"(do-nothing)實(shí)現(xiàn),可在不需要同步時(shí)用作替換。

            ACE_RW_Mutex

            封裝讀者/作者鎖的包裝類。它們是分別為讀和寫(xiě)進(jìn)行獲取的鎖,在沒(méi)有作者在寫(xiě)的時(shí)候,多個(gè)讀者可以同時(shí)進(jìn)行讀取。

            ACE_RW_Thread_Mutex

            可用于替換ACE_RW_Mutex,專用于線程同步。

            ACE_RW_Process_Mutex

            可用于替換ACE_RW_Mutex,專用于進(jìn)程同步。

            ACE_Semaphore

            這些類實(shí)現(xiàn)計(jì)數(shù)信號(hào)量,在有固定數(shù)量的線程可以同時(shí)訪問(wèn)一個(gè)資源時(shí)很有用。在OS不提供這種同步機(jī)制的情況下,可通過(guò)互斥體來(lái)進(jìn)行模擬。

            ACE_Thread_Semaphore

            應(yīng)被用于替換ACE_Semaphore,專用于線程同步。

            ACE_Process_Semaphore

            應(yīng)被用于替換ACE_Semaphore,專用于進(jìn)程同步。

            ACE_Token

            提供"遞歸互斥體"(recursive mutex),也就是,當(dāng)前持有某令牌的線程可以多次重新獲取它,而不會(huì)阻塞。而且,當(dāng)令牌被釋放時(shí),它確保下一個(gè)正阻塞并等待此令牌的線程就是下一個(gè)被放行的線程。

            ACE_Null_Token

            令牌接口的"無(wú)為"(do-nothing)實(shí)現(xiàn),在你知道不會(huì)出現(xiàn)多個(gè)線程時(shí)使用。

            ACE_Lock

            定義鎖定接口的接口類。一個(gè)純虛類,如果使用的話,必須承受虛函數(shù)調(diào)用開(kāi)銷。

            ACE_Lock_Adapter

            基于模板的適配器,允許將前面提到的任意一種鎖定機(jī)制適配到ACE_Lock接口。

            可以簡(jiǎn)單的分為以下幾類:

            1. 互斥鎖
              互斥鎖(通常稱為"互斥體"或"二元信號(hào)量")用于保護(hù)多線程控制并發(fā)訪問(wèn)的共享資源的完整性。互斥體通過(guò)定義臨界區(qū)來(lái)序列化多線程控制的執(zhí)行,在臨界區(qū)中每一時(shí)刻只有一個(gè)線程在執(zhí)行它的代碼。互斥體簡(jiǎn)單而高效(時(shí)間和空間)。
              ACE線程庫(kù)提供了Mutex式的類(是一組互斥體對(duì)象,擁有類似的接口),他是一種簡(jiǎn)單而高效的類型是"非遞歸"互斥體。非遞歸互斥體不允許當(dāng)前擁有互斥體的線程在釋放它之前重新獲取它。否則,將會(huì)立即發(fā)生死鎖。遞歸互斥體在ACE Recursive_Thread_Mutex類中可移植地實(shí)現(xiàn)。
            2. 讀者/作者鎖
              讀者/作者鎖與互斥體相類似。例如,獲取讀者/作者鎖的線程也必須釋放它。多個(gè)線程可同時(shí)獲取一個(gè)讀者/作者鎖用于讀,但只有一個(gè)線程可以獲取該鎖用于寫(xiě)。當(dāng)互斥體保護(hù)的資源用于讀遠(yuǎn)比用于寫(xiě)要頻繁時(shí),讀者/作者互斥體有助于改善并發(fā)的執(zhí)行。
              ACE線程庫(kù)提供了一個(gè)叫作RW_Mutex的類,在C++封裝類中可移植地實(shí)現(xiàn)了讀者/作者鎖的語(yǔ)義。讀者/作者鎖將優(yōu)先選擇權(quán)給作者。因而,如果有多個(gè)讀者和一個(gè)作者在鎖上等待,作者將會(huì)首先獲取它。

            計(jì)數(shù)信號(hào)量
            在概念上,計(jì)數(shù)信號(hào)量是可以原子地增減的整數(shù)。如果線程試圖減少一個(gè)值為零的信號(hào)量的值,它就會(huì)阻塞,直到另一個(gè)線程增加該信號(hào)量的值。
            計(jì)數(shù)信號(hào)量用于追蹤共享程序狀態(tài)的變化。它們記錄某種特定事件的發(fā)生。因?yàn)樾盘?hào)量維護(hù)狀態(tài),它們?cè)试S線程根據(jù)該狀態(tài)來(lái)作決定,即使事件是發(fā)生在過(guò)去。
            信號(hào)量比互斥體效率要低,但是,它們要更為通用,因?yàn)樗鼈儫o(wú)需被最初獲取它們的同一線程獲取和釋放。這使得它們能夠用于異步的執(zhí)行上下文中(比如信號(hào)處理器)。ACE線程庫(kù)提供一個(gè)叫作Semaphore的類來(lái)可移植地在C++包裝類中實(shí)現(xiàn)信號(hào)量語(yǔ)義。

            posted on 2010-05-14 10:03 老馬驛站 閱讀(1107) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ACE
            99久久免费国产精品特黄| 色婷婷久久综合中文久久一本| 伊人久久成人成综合网222| 久久久无码精品亚洲日韩软件| 欧美国产成人久久精品| 2021国内久久精品| 久久精品国产亚洲麻豆| 精品久久国产一区二区三区香蕉| 无码精品久久久久久人妻中字| 国内精品久久久久| 久久精品三级视频| 日产精品久久久久久久性色| 99热成人精品免费久久| 日产精品久久久久久久| 欧美一级久久久久久久大| 国产精品久久久久天天影视| 午夜精品久久久久9999高清| 色综合久久中文色婷婷| 人妻精品久久无码区| 久久夜色精品国产亚洲av| 亚洲国产精品婷婷久久| 一本色道久久99一综合| 伊人久久大香线蕉综合网站| 国产V综合V亚洲欧美久久| 99久久精品国产一区二区| 久久久噜噜噜久久| 久久精品国产WWW456C0M| 久久国产精品久久国产精品| 99久久婷婷国产综合精品草原| 伊人色综合久久天天人守人婷| 国产精品九九久久精品女同亚洲欧美日韩综合区| 99久久免费国产精品特黄| 久久久精品波多野结衣| 久久99精品久久久久久噜噜| 91精品国产综合久久香蕉| 日本精品久久久久中文字幕8| 久久国产乱子精品免费女| 国产精品福利一区二区久久| 97久久超碰成人精品网站| 国产精品久久国产精品99盘| 精品久久久久久中文字幕|