boost多執行緒之mutex與lock

2021-07-24 18:02:17 字數 1904 閱讀 5967

mutex類主要有兩種:獨佔式與共享式的互斥量。

▲ 獨佔式互斥量:

mutex: 獨佔式的互斥量,是最簡單最常用的一種互斥量型別

try_mutex: 它是mutex的同義詞,為了與相容以前的版本而提供

timed_mutex: 它也是獨佔式的互斥量,但提供超時鎖定功能

▲ 遞迴式互斥量:

recursive_mutex: 遞迴式互斥量,可以多次鎖定,相應地也要多次解鎖

recursive_try_mutex: 它是recursive_mutex 的同義詞,為了與相容以前的版本而提供

recursive_timed_mutex: 它也是遞迴式互斥量,基本功能同recursive_mutex, 但提供超時鎖定功能

▲ 共享式互斥量:

shared_mutex: multiple-reader/single-writer 型的共享互斥量(又稱讀寫鎖)。

其中mutex有lock和unlock方法,shared_mutex除了提供lock和unlock方法外,還有shared_lock和shared_unlock方法。

▲ 獨佔鎖:

boost::unique_lock,其中t可以mutex中的任意一種。

如果t為mutex,那麼boost::unique_lock,構造與析構時則分別自動呼叫lock和unlock方法。

如果t為shared_mutex,那麼boost::unique_lock,構造與析構時則分別呼叫shared_mutex的shared_lock和shared_unlock方法。

注意:scoped_lock也是獨佔鎖,其源**中定義如下;

typedef unique_lockscoped_lock;

typedef unique_lockscoped_timed_lock;

▲ 共享鎖:

boost::shared_lock,其中的t只能是shared_mutex類。

當然還有其他一些鎖:lock_guard, upgrade_lock等。

typedef boost::shared_lockreadlock;  

typedef boost::unique_lockwritelock;

boost::shared_mutex rwmutex;

void readonly()

void writeonly()

對同乙個rwmutex,執行緒可以同時有多個readlock,這些readlock會阻塞任意乙個企圖獲得writelock的執行緒,直到所有的readlock物件都析構。如果writelock首先獲得了rwmutex,那麼它會阻塞任意乙個企圖在rwmutex上獲得readlock或者writelock的執行緒。

boost::mutex m;  

void foo( )

;

// lock_guard只能像上面這樣使用,而unique_lock允許設定超時,推遲鎖定lock以及在物件銷毀之前unlock。

;

// 設定鎖超時

;

namespace  

void threadfun1()

} void threadfun2()

} void threadfun3()

} }

// 1. mutex例子

void test_thread_syn1()

// 2. lock_guard例子

void test_thread_syn2()

// 3. scoped_lock例子

void test_thread_syn3()

多執行緒之Mutex 互斥量

include include include long g count 0 long g sum 0 static const int g s count 10 critical section g csthreadparamer critical section g csthreadcode h...

C 多執行緒程式設計之mutex

參考 www.cplusplus.com 互斥量 互斥鎖,用於鎖住臨界區,防止多個執行緒同時處於臨界區中對臨界資源進行操作。c 中的 mutex是乙個類,可建立可鎖物件。mutex物件提供專屬所有權,且不支援遞迴。所謂專屬所有權是指,對已經被其他執行緒占有的mutex物件,當前執行緒不能再進行鎖操作...

C 11多執行緒之mutex

mutex類是能用於保護共享資料免受從多個執行緒同時訪問的同步原語。mutex既不可複製亦不可移動。構造互斥。呼叫後互斥在未鎖定狀態。mutex 複製建構函式被刪除。mutex const mutex delete lock 鎖定互斥。若另一線程已鎖定互斥,則到lock的呼叫將阻塞執行,直至獲得鎖。...