C++ 多线程:互斥对象 lock_gurad
生活随笔
收集整理的這篇文章主要介紹了
C++ 多线程:互斥对象 lock_gurad
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
描述
- 頭文件:
<mutex> - 聲明方式:
template< class Mutex > class lock_guard; - 簡介
lock_guard是一種互斥包裝器,它提供了非常便捷的raii資源管控技術(shù)用來在對象生存周期內(nèi)提供互斥鎖。
lock_gurad很好得解決了互斥變量mutex的鎖成員在函數(shù)異常期間無法正常回收資源的問題。當(dāng)lock_guard對象創(chuàng)建之時(shí)即嘗試獲取鎖的所有權(quán),當(dāng)該對象離開其所創(chuàng)建的作用域時(shí)會銷毀lock_gurad并釋放互斥變量的鎖。PS:lock_guard 對象是不可賦值的,它不支持賦值運(yùn)算符
成員函數(shù)
-
構(gòu)造函數(shù)
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)
獲得給定的互斥變量所有權(quán):
(1) 等效于調(diào)用m.lock()成員。若m不是遞歸鎖(即傳入地址),且當(dāng)前線程已經(jīng)占有m,則當(dāng)前構(gòu)造是未定義的
(2)獲得互斥m的所有權(quán)但并不調(diào)用lock進(jìn)行鎖定,若當(dāng)前線程不占有m,則構(gòu)造是未定義的。
(3)不存在拷貝構(gòu)造函數(shù)
如果m先于lock_guard被銷毀,則構(gòu)造函數(shù)未定義 -
析構(gòu)函數(shù)
std::lock_guard<Mutex>::~lock_guard
釋放所占有互斥的所有權(quán)。
等效地調(diào)用 m.unlock() ,其中 m 是傳遞個(gè) lock_guard 的構(gòu)造函數(shù)的互斥。
使用案例如下:
#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';}// 當(dāng)lock_guard離開當(dāng)前作用域時(shí)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
總結(jié)
lock_guard提供了自動回收資源的raii技術(shù),能夠在對象構(gòu)造時(shí)加鎖,析構(gòu)時(shí)解鎖,防止因程序異常退出或者忘記unlock造成的死鎖問題
總結(jié)
以上是生活随笔為你收集整理的C++ 多线程:互斥对象 lock_gurad的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄联盟装备影焰介绍
- 下一篇: C++ 多线程:条件变量 std::co