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

2021-09-30 04:40:25 字數 1158 閱讀 7380

ace guard類屬

與c一級的互斥體api相比較,mutex包裝為同步多執行緒控制提供了一種優雅的介面。但是,mutex潛在地容易出錯,因為程式設計師有可 能忘記呼叫release方法(當然,c級的互斥體api更容易出錯)。這可能由於程式設計師的疏忽或是c++異常的發生而發生,然而,其導致及其嚴重的後果 --死鎖。

因此,為改善應用的健壯性,ace同步機制有效地利用c++類構造器和析構器的語義來確保mutex鎖被自動獲取和釋放。

ace提供了乙個稱為guard 、write_guard 和read_guard 的類族,確保在進入和退出c++**塊時分別自動獲取和釋放鎖。

guard類是最基本的守衛機制,定義可以簡化 如下(實際定義比這相對要複雜而完善一點):

template

class guard

˜guard (void )

private :

lock lock_;}

guard類的物件定義一"塊"**,在其上鎖被自動獲取,並在退出塊時自動釋放,即使是程式拋異常也能保證自動解鎖。這種機制也能為mutex、rw_mutex和semaphore同步封裝工作。

對於讀寫鎖,由於加鎖介面不一樣,ace也提供了相應的read_guard和write_guard類,read_guard和write_guard類有著與guard類相同的介面。但是,它們的acquire方法分別對鎖進行讀和寫。

預設地, guard類構造器將會阻塞 程 序,直到鎖被獲取。會有這樣的情況,程式必須使用非阻塞的acquire呼叫(例如,防止死鎖)。因此,可以傳給ace guard的構造器第二個引數(請參看原始**,而不是我這裡的簡化**),指示它使用鎖的try_acquire方法,而不是acquire。隨後呼叫 者可以使用guard的locked方法來原子地測試實際上鎖是否已被獲取。

void * thread1(void *arg)

相比較而言,使用guard更加簡潔,並且會自動解鎖,免除了一部分後顧之憂。

注意:

guard只能幫你自動加解鎖,並不能解決死鎖問題 ,特別是對於那些非遞迴的互斥體來說使用guard尤其要注意防止死鎖。

guard是在guard變數析構時解鎖,如果在同一函式 中兩次對同一互斥體變數 使用guard要注意其物件生命週期,否則容易造成死鎖。

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

ace guard類屬 與c一級的互斥體api相比較,mutex包裝為同步多執行緒控制提供了一種優雅的介面。但是,mutex潛在地容易出錯,因為程式設計師有可能忘記呼叫release方法 當然,c級的互斥體api更容易出錯 這可能由於程式設計師的疏忽或是c 異常的發生而發生,然而,其導致及其嚴重的後...

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

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

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

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