boost互斥鎖 boost鎖使用總結

2021-10-17 05:40:28 字數 1924 閱讀 7230

boost鎖的概述:

boost庫中提供了mutex類與lock類,通過組合可以輕易的構建讀寫鎖與互斥鎖。

舉個通俗的例子,如果共享資源是乙個自動鎖住的房間,互斥體是鑰匙,進入房間必須取鑰匙,離開房間應該還鑰匙。這就對應著互斥體的lock(取鑰匙)和unlock(還鑰匙)。

動態分配記憶體存在類似的情況。如果忘記delete,會導致記憶體洩漏。它是如何解決的?在棧上分配物件,要乙個特點,那就是離開作用域後,物件肯定要呼叫析構方法。利用這個特點,可以使用物件對指標封裝,在物件的析構方法中進行delete,就保證了一定會執行delete。這就是智慧型指標。因為智慧型指標,不是針對乙個特定型別的指標,因此把智慧型指標設計為類的模版,根據模版實參特例化乙個模板類。同樣道理,也可以使用相同技術,對互斥體封裝。這就是lock類模版。在lock的構造方法呼叫互斥體的lock方法,在lock的析構方法呼叫互斥體的unlock方法。mutex是物件類,lock是模板類。

mutex物件類:

mutex類主要有兩種:boost::mutex,boost::shared_mutex,其中mutex有lock和unlock方法,shared_mutex除了提供lock和unlock方法外,還有shared_lock和shared_unlock方法。因此,boost::mutex為獨佔互斥類,boost::shared_mutex為共享互斥類。

lock模板類:

boost::unique_lock,boost::shared_lock,其中unique_lock為獨佔鎖,shared_lock為共享鎖。unique_lock中的t可以為mutex類中的任意一種,如果為shared_mutex,那麼boost::unique_lock<:shared_mutex>類的物件建構函式構造時,會自動呼叫shared_mutex的shared_lock方法,析構函式裡,會自動呼叫shared_mutex的shared_unlock方法。如果是boost::

unique_lock<:mutex>,則分別自動呼叫lock和unlock方法。

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

讀寫鎖的實現:

typedefboost::shared_lock<:shared_mutex> readlock;

typedef boost::unique_lock<:shared_mutex> writelock;

boost::shared_mutex rwmutex;

void readonly( )

readlock  rdlock( rwmutex );

/// do something

void writeonly( )

writelock  wtlock( rwmutex );

/// do something

對同乙個rwmutex,執行緒可以同時有多個readlock,這些readlock會阻塞任意乙個企圖獲得writelock的執行緒,直到所有的readlock物件都析構。如果writelock首先獲得了rwmutex,那麼它會阻塞任意乙個企圖在rwmutex上獲得readlock或者writelock的執行緒。boost::shared_lock使用要小心,千萬不要同乙個執行緒多次進入。

互斥鎖的實現:

typedef boost::unique_lock<:mutex> exclusivelock;

遞迴式的互斥量:

boost::recursive_mutex提供乙個遞迴式的互斥量。對於乙個例項最多允許乙個執行緒擁有其鎖定,如果乙個執行緒已經鎖定乙個boost::recursive_mutex例項,那麼這個執行緒可以多次鎖定這個例項。

boost::mutex::scoped_lock

boost::mutexio_mutex;

void foo( )

boost::mutex::scoped_lock lock( io_mutex);         ///鎖定

} ///解鎖

boost互斥鎖 boost 同步 互斥量的概念

互斥物件有利於實現多執行緒中資料的執行緒安全。執行緒呼叫鎖函式來獲得互斥物件的所有權,呼叫對應的解鎖函式來放棄所有權。互斥量可以是遞迴或非遞迴的,並且可以同時把所有權賦給多個執行緒。boost.thread提供獨佔的遞迴 非遞迴互斥量,以及共享 多讀單一寫 互斥量。basiclockable概念 b...

boost實踐之互斥鎖

include std mutex socket list mu socket list mu lock socket list mu unlock 使用mutex是不安全的,當乙個執行緒在解鎖之前異常退出了,那麼其它被阻塞的執行緒就無法繼續下去.std lock guardlock socket ...

boost 互斥體和鎖

1 共享資源是乙個自動鎖住的房間,互斥體是鑰匙,進入房間必須取鑰匙,離開房間應該還鑰匙。這就對應著互斥體的lock 取鑰匙 和unlock 還鑰匙 2 考慮下面的場景 還鑰匙的時候出現異常,會發生什麼?導致死鎖,因為鑰匙歸還失敗,所有人都沒法再取到鑰匙。3 如何解決這個問題?想一下,動態分配記憶體存...