C++ 多线程:互斥对象 lock_gurad
生活随笔
收集整理的這篇文章主要介紹了
C++ 多线程:互斥对象 lock_gurad
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述
- 頭文件:
<mutex> - 聲明方式:
template< class Mutex > class lock_guard; - 簡介
lock_guard是一種互斥包裝器,它提供了非常便捷的raii資源管控技術用來在對象生存周期內提供互斥鎖。
lock_gurad很好得解決了互斥變量mutex的鎖成員在函數異常期間無法正常回收資源的問題。當lock_guard對象創(chuàng)建之時即嘗試獲取鎖的所有權,當該對象離開其所創(chuàng)建的作用域時會銷毀lock_gurad并釋放互斥變量的鎖。PS:lock_guard 對象是不可賦值的,它不支持賦值運算符
成員函數
-
構造函數
std::lock_guard<Mutex>::lock_guardexplicit lock_guard( mutex_type& m ); (1)lock_guard( mutex_type& m, std::adopt_lock_t t ); (2)lock_guard( const lock_guard& ) = delete; (3)
獲得給定的互斥變量所有權:
(1) 等效于調用m.lock()成員。若m不是遞歸鎖(即傳入地址),且當前線程已經占有m,則當前構造是未定義的
(2)獲得互斥m的所有權但并不調用lock進行鎖定,若當前線程不占有m,則構造是未定義的。
(3)不存在拷貝構造函數
如果m先于lock_guard被銷毀,則構造函數未定義 -
析構函數
std::lock_guard<Mutex>::~lock_guard
釋放所占有互斥的所有權。
等效地調用 m.unlock() ,其中 m 是傳遞個 lock_guard 的構造函數的互斥。
使用案例如下:
#include <thread>
#include <mutex>
#include <iostream>int g_i = 0;
std::mutex g_i_mutex; // protects g_ivoid safe_increment()
{std::lock_guard<std::mutex> lock(g_i_mutex);for (int i = 0;i < 10; ++i){++g_i;std::cout << std::this_thread::get_id() << ": " << g_i << '\n';}// 當lock_guard離開當前作用域時mutex互斥量會自動釋放
}int main()
{std::cout << "main: " << g_i << '\n';std::thread t1(safe_increment);std::thread t2(safe_increment);t1.join();t2.join();std::cout << "main: " << g_i << '\n';
}
輸出如下:
main: 0
0x700004de4000: 1
0x700004de4000: 2
0x700004de4000: 3
0x700004de4000: 4
0x700004de4000: 5
0x700004de4000: 6
0x700004de4000: 7
0x700004de4000: 8
0x700004de4000: 9
0x700004de4000: 10
0x700004e67000: 11
0x700004e67000: 12
0x700004e67000: 13
0x700004e67000: 14
0x700004e67000: 15
0x700004e67000: 16
0x700004e67000: 17
0x700004e67000: 18
0x700004e67000: 19
0x700004e67000: 20
main: 20
總結
lock_guard提供了自動回收資源的raii技術,能夠在對象構造時加鎖,析構時解鎖,防止因程序異常退出或者忘記unlock造成的死鎖問題
總結
以上是生活随笔為你收集整理的C++ 多线程:互斥对象 lock_gurad的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄联盟装备影焰介绍
- 下一篇: C++ 多线程:条件变量 std::co