日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C++ 多线程:互斥对象 lock_gurad

發(fā)布時(shí)間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_guard

    • explicit 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。