鎖類屬包含的類包裝簡(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è)方法:
- acquire():用來(lái)獲取互斥體,如果無(wú)法獲取,將阻塞至獲取到為止。
- 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)單的分為以下幾類:
- 互斥鎖
互斥鎖(通常稱為"互斥體"或"二元信號(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)。
- 讀者/作者鎖
讀者/作者鎖與互斥體相類似。例如,獲取讀者/作者鎖的線程也必須釋放它。多個(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