一、lock_guard實現
template class lock_guard { public: using mutex_type = Mutex; explicit lock_guard(mutex_type& mutex) : _mutex(mutex) { _mutex.lock(); } lock_guard(mutex_type& mutex, adopt_lock_t) : _mutex(mutex) {} ~lock_guard() { _mutex.unlock(); } lock_guard() = delete; lock_guard(const lock_guard&) = delete; lock_guard& operator=(const lock_guard&) = delete; private: mutex_type& _mutex; };
lock_guard是一個RAII封裝的鎖,它強制在構造期間獲得鎖,在析構期間釋放鎖。lock_guard實現了一個「mutex媽媽」模式,在構造函數中獲得鎖,在析構函數中釋放鎖。lock_guard實現簡單,使用簡單。
二、c++ lock_guard
c++11和之前的標準庫都已經提供了lock_guard。這意味着我們可以使用std::lock_guard來保護一個操作。std::mutex(或其他互斥對象)是一個RAII類,用於管理與互斥量相關的鎖。lock_guard聲明一個對象並使用std::adopt_lock的參數調用構造函數,可以將這個鎖的管理權交給這個對象(這就是我們在構造函數中傳遞的參數)。當我們在這個對象的生命周期結束時,std::lock_guard會自動釋放互斥量。
#include #include #include std::mutex m; void foo() { std::lock_guard lock(m); std::cout << "Thread " << std::this_thread::get_id() << " is executing foo()\n"; } int main() { std::thread t1(foo); std::thread t2(foo); t1.join(); t2.join(); return 0; }
三、std lock_guard
lock_guard是std命名空間中包含的一個類,其目的是在構造時鎖定互斥鎖,在析構時釋放鎖。std::lock_guard的作用是保護比較短的互斥鎖。當有必要保護一個對象或代碼段,而這個保護不會被其他代碼打斷時,可以使用std::lock_guard來保護。
#include #include #include std::mutex m; void foo() { std::lock_guard lock(m); std::cout << "Thread " << std::this_thread::get_id() << " is executing foo()\n"; } int main() { std::thread t1(foo); std::thread t2(foo); t1.join(); t2.join(); return 0; }
四、lock_guard與unique_lock
lock_guard和unique_lock都是互斥鎖的RAII封裝,但它們之間的區別有哪些呢?unique_lock有更多的功能,它支持C++11標準庫的move語義,可以在傳遞所有權時使用,而lock_guard不支持。
unique_lock還可以在已經鎖定的mutex上等待信號量,可以採用不同的鎖調度策略,比如超時等。
#include #include #include std::mutex m; void foo() { std::unique_lock lock(m); std::cout << "Thread " << std::this_thread::get_id() << " is executing foo()\n"; } int main() { std::thread t1(foo); std::thread t2(foo); t1.join(); t2.join(); return 0; }
在上面的代碼中,我們使用unique_lock創建一個std::mutex對象的鎖,foo()函數獲得互斥鎖,並在已經獲得鎖的情況下執行了一段代碼,這意味着即使線程被中斷,它也將在互斥鎖上等待。
通過這篇文章,我們詳細闡述了lock_guard和unique_lock的構造函數和應用。lock_guard和unique_lock是C++11提供的兩種mutex的RAII封裝,是C++中保證線程安全的重要手段,很少出現鎖的泄漏以及鎖的鎖定時間過長。對於編寫安全的並發代碼是極其重要的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/293548.html