使用互斥元保护共享数据-lock_guard
生活随笔
收集整理的這篇文章主要介紹了
使用互斥元保护共享数据-lock_guard
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用互斥元保護共享數據
線程相對于進程的優勢在于能夠共享數據,線程相對于進程的劣勢也在于數據能夠共享。如何多個線程安全的訪問數據,你可以使用互斥鎖保護數據,也可以優化數據結構使用無鎖編程,或者使用事務保證數據同一時間只能被一個線程訪問。
這里主要說的就是如何使用互斥鎖對數據進行保護,使用互斥鎖有一個問題就是需要使用者,在需要更改數據的時候調用lock()對數據加鎖,在更改數據結束之后調用unlock()對數據解鎖,如果漏掉解鎖或者因為異常處理原因跳過解鎖函數會導致死鎖。
人為的去加鎖和解鎖不可避免的會出現只寫了加鎖而忘記解鎖的情況,但是C++有一類函數會自動的執行,這些函數就是類的構造函數和類的析構函數,當創建類的時候自動的調用構造函數,當類銷毀的時候就會調用析構函數,不需要人為的參與,這樣就避免了因為人為的原因導致的死鎖問題,C++已經提供了該類的實現,就是接下來要介紹的lock_guard函數
為了防止出現這種狀況可以使用類的構造和析構進行數據的加鎖和解鎖
具體實現如下:
template<typename _Mutex> class lock_guard {public:typedef _Mutex mutex_type;// 調用構造函數 進行加鎖explicit lock_guard(mutex_type& __m) : _M_device(__m){ _M_device.lock(); }lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m){ } // calling thread owns mutex// 調用析構函數進行解鎖~lock_guard(){ _M_device.unlock(); }lock_guard(const lock_guard&) = delete;lock_guard& operator=(const lock_guard&) = delete;private:mutex_type& _M_device; };設計一個利用lock_guard進行加鎖和解鎖的demo如下:
// // Created by andrew on 2021/3/31. // #include <iostream> #include <list> #include <mutex> #include <algorithm>using namespace std;// 聲明一個卻局鏈表 list<int> g_list; // 聲明一個互斥鎖用于保護全局鏈表數據 mutex list_mutex;void push_data_to_list(int newValue) { // 每次進來創建guard, 構造函數中會調用全局鎖,在該函數退出的時候會自動調用析構函數實現 // 鎖的釋放lock_guard<std::mutex> guard(list_mutex);g_list.push_back(newValue); }bool find_list_data(int valueData) {lock_guard<mutex> guard(list_mutex);return find(g_list.begin(), g_list.end(), valueData) != g_list.end(); }int main(int argc, char * argv[]) {push_data_to_list(42);cout << "find 1 = " << find_list_data(1) << " find 42 = " << find_list_data(42) << endl;return 0; }總結
以上是生活随笔為你收集整理的使用互斥元保护共享数据-lock_guard的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:熊刚,男,博士,现任中国科学院自动
- 下一篇: 原子操作和互斥量的区别