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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

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

    獲得給定的互斥變量所有權:
    (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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。