ACE執行緒管理機制 併發控制 1

2022-09-03 08:36:11 字數 3110 閱讀 4468

**於:

ace lock類屬

鎖類屬包含的類包裝簡單的鎖定機制,比如互斥體、訊號量、讀/寫互斥體和令牌等。這裡我就以互斥體為例簡單的介紹一下其使用方法,對其它的鎖類進行一些簡單的說明。

1.互斥體的使用。

互斥體用於保護共享的易變**,也就是全域性或靜態資料。這樣的資料必須通過互斥體進行保護,以防止它們在多個執行緒同時訪問時損壞。

在ace中可以通過ace_thread_mutex實現執行緒的訪問互斥,下面的例子演示ace_thread_mutex類的使用。

#include "ace/thread.h" 

#include "ace/synch.h" 

#include 

using namespace std;

ace_thread_mutex mutex;

void* thread1(void *arg) 

{mutex.acquire();

ace_os::sleep(3);

coutacquire():用來獲取互斥體,如果無法獲取,將阻塞至獲取到為止。

release():用來釋放互斥體,從而使自己或者其它執行緒能夠獲取互斥體。

當執行緒要訪問共享資源時,首先呼叫acquire()方法獲取互斥體,從而獲取對改互斥體所保護的共享資源的唯一訪問許可權,訪問結束時呼叫釋放互斥體,使得其它執行緒能獲取共享資源的訪問許可權。

在此例中,本來thread2的列印訊息在thread1之前,但由於thread1先獲得互斥體,故thread2只有待thread1結束後才能進入臨界區。讀者朋友們可以通過將ace_thread_mutex替換為ace_null_mutex看一下不加鎖的執行結果。

2.ace lock類屬簡介。

ace lock類屬列表如下:

名字

描述

ace_mutex

封裝互斥機制(根據平台,可以是mutex_t、pthread_mutex_t等等)的包裝類,用於提供簡單而有效的機制來使對共享資源的訪問序列化。它與二元訊號量(binary semaphore)的功能相類似。可被用於執行緒和程序間的互斥。

ace_thread_mutex

可用於替換ace_mutex,專用於執行緒同步。

ace_process_mutex

可用於替換ace_mutex,專用於程序同步。

ace_null_mutex

提供了ace_mutex介面的"無為"(do-nothing)實現,可在不需要同步時用作替換。

ace_rw_mutex

封裝讀者/作者鎖的包裝類。它們是分別為讀和寫進行獲取的鎖,在沒有作者在寫的時候,多個讀者可以同時進行讀取。

ace_rw_thread_mutex

可用於替換ace_rw_mutex,專用於執行緒同步。

ace_rw_process_mutex

可用於替換ace_rw_mutex,專用於程序同步。

ace_semaphore

這些類實現計數訊號量,在有固定數量的執行緒可以同時訪問乙個資源時很有用。在os不提供這種同步機制的情況下,可通過互斥體來進行模擬。

ace_thread_semaphore

應被用於替換ace_semaphore,專用於執行緒同步。

ace_process_semaphore

應被用於替換ace_semaphore,專用於程序同步。

ace_token

提供"遞迴互斥體"(recursive mutex),也就是,當前持有某令牌的執行緒可以多次重新獲取它,而不會阻塞。而且,當令牌被釋放時,它確保下乙個正阻塞並等待此令牌的執行緒就是下乙個被放行的執行緒。

ace_null_token

令牌介面的"無為"(do-nothing)實現,在你知道不會出現多個執行緒時使用。

ace_lock

定義鎖定介面的介面類。乙個純虛類,如果使用的話,必須承受虛函式呼叫開銷。

ace_lock_adapter

基於模板的介面卡,允許將前面提到的任意一種鎖定機制適配到ace_lock介面。

可以簡單的分為以下幾類:

互斥鎖互斥鎖(通常稱為"互斥體"或"二元訊號量")用於保護多執行緒控制併發訪問的共享資源的完整性。互斥體通過定義臨界區來序列化多執行緒控制的執行,在臨界區中每一時刻只有乙個執行緒在執行它的**。互斥體簡單而高效(時間和空間)。

ace執行緒庫提供了mutex式的類(是一組互斥體物件,擁有類似的介面),他是一種簡單而高效的型別是"非遞迴"互斥體。非遞迴互斥體不允許當前擁有互斥體的執行緒在釋放它之前重新獲取它。否則,將會立即發生死鎖。遞迴互斥體在ace recursive_thread_mutex類中可移植地實現。

讀者/作者鎖

讀者/作者鎖與互斥體相類似。例如,獲取讀者/作者鎖的執行緒也必須釋放它。多個執行緒可同時獲取乙個讀者/作者鎖用於讀,但只有乙個執行緒可以獲取該鎖用於寫。當互斥體保護的資源用於讀遠比用於寫要頻繁時,讀者/作者互斥體有助於改善併發的執行。

ace執行緒庫提供了乙個叫作rw_mutex的類,在c++封裝類中可移植地實現了讀者/作者鎖的語義。讀者/作者鎖將優先選擇權給作者。因而,如果有多個讀者和乙個作者在鎖上等待,作者將會首先獲取它。

計數訊號量

在概念上,計數訊號量是可以原子地增減的整數。如果執行緒試圖減少乙個值為零的訊號量的值,它就會阻塞,直到另乙個執行緒增加該訊號量的值。

計數訊號量用於追蹤共享程式狀態的變化。它們記錄某種特定事件的發生。因為訊號量維護狀態,它們允許執行緒根據該狀態來作決定,即使事件是發生在過去。

訊號量比互斥體效率要低,但是,它們要更為通用,因為它們無需被最初獲取它們的同一執行緒獲取和釋放。這使得它們能夠用於非同步的執行上下文中(比如訊號處理器)。ace執行緒庫提供乙個叫作semaphore的類來可移植地在c++包裝類中實現訊號量語義。

ACE執行緒管理機制 併發控制 1

ace lock類屬 鎖類屬包含的類包裝簡單的鎖定機制,比如互斥體 訊號量 讀 寫互斥體和令牌等。這裡我就以互斥體為例簡單的介紹一下其使用方法,對其它的鎖類進行一些簡單的說明。1 互斥體的使用。互斥體用於保護共享的易變 也就是全域性或靜態資料。這樣的資料必須通過互斥體進行保護,以防止它們在多個執行緒...

ACE執行緒管理機制 併發控制 1

ace lock類屬 鎖類屬包含的類包裝簡單的鎖定機制,比如互斥體 訊號量 讀 寫互斥體和令牌等。這裡我就以互斥體為例簡單的介紹一下其使用方法,對其它的鎖類進行一些簡單的說明。1 互斥體的使用。互斥體用於保護共享的易變 也就是全域性或靜態資料。這樣的資料必須通過互斥體進行保護,以防止它們在多個執行緒...

ACE執行緒管理機制 併發控制 3

ace condition類屬 ace condition類屬 條件變數 提供風格與互斥體 讀者 作者鎖和計數訊號量不同的鎖定機制。當持有鎖的執行緒在臨界區執行 時,這三種機制讓協作執行緒進行等待。相反,條件變數通常被乙個執行緒用於使自己等待,直到乙個涉及共享資料的條件表示式到達特定的狀態。當另外的...