最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 11中l(wèi)ock_guard和unique_lock的區(qū)別

 更新時間:2025年07月14日 10:06:17   作者:追烽少年x  
在C++11中,std::lock_guard 和 std::unique_lock 都是用于管理互斥鎖的RAII類,但它們在功能和使用場景上有一些重要的區(qū)別,下面就來介紹一下兩者的區(qū)別,感興趣的可以了解一下

在C++11中,std::lock_guardstd::unique_lock 都是用于管理互斥鎖(std::mutex 或其他互斥鎖類型)的RAII(資源獲取即初始化)類,但它們在功能和使用場景上有一些重要的區(qū)別。以下是它們的主要區(qū)別:

一、功能設計

1.1 std::lock_guard

功能單一std::lock_guard 的唯一目的是在構造時鎖定互斥鎖,并在析構時釋放互斥鎖。它不支持手動解鎖。

使用場景:適用于需要在某個作用域內(nèi)簡單地鎖定和解鎖互斥鎖的場景,且不需要中途解鎖。

代碼示例

#include<thread>
#include<mutex>
std::mutex mt;
void function()
{
    // 構造lock對象時,鎖定
    std::lock_guard<std::mutex> lock(mt);
    // 在這個作用域內(nèi),互斥鎖保持鎖定狀態(tài)
    ...
    // lock 對象析構時,互斥鎖自動解鎖。     
}

1.2 std::unique_lock 

功能豐富std::unique_lock 提供了更靈活的鎖管理功能。它支持手動鎖定和解鎖,還可以在構造時不立即鎖定互斥鎖。

使用場景:適用于需要更靈活地控制鎖的場景,例如在條件變量等待時需要解鎖互斥鎖,或者在某些條件下才鎖定互斥鎖。

代碼示例

#include<thread>
#include<mutex>
std::mutex mt;
void function()
{
    // 構造lock對象時,鎖定
    std::unique_lock<std::mutex> lock(mt);
    // 手動解鎖
    lock.unlock();
    // 在這個作用域內(nèi),互斥鎖是解鎖狀態(tài)
    ...
    // 從新鎖定
    lock.lock();
    // lock 對象析構時,互斥鎖自動解鎖。     
}

二、構造方式

2.1 std::lock_guard 

  • 構造時必須傳遞一個互斥鎖對象,并且會立即鎖定該互斥鎖。

構造函數(shù)

 explicit lock_guard(_Mutex& _Mtx) : _MyMutex(_Mtx) { // construct and lock
     _MyMutex.lock();
 }

 lock_guard(_Mutex& _Mtx, adopt_lock_t) noexcept // strengthened
     : _MyMutex(_Mtx) {} // construct but don't lock
  • 默認情況下,會立即鎖定互斥鎖。
  • 如果傳遞了 std::adopt_lock,表示互斥鎖已經(jīng)被當前線程鎖定,std::lock_guard 只負責管理鎖的釋放。

2.2 std::unique_lock

構造時可以選擇不立即鎖定互斥鎖,或者傳遞一個已經(jīng)鎖定的互斥鎖。

構造函數(shù)

 _NODISCARD_CTOR_LOCK explicit unique_lock(_Mutex& _Mtx)
     : _Pmtx(_STD addressof(_Mtx)), _Owns(false) { // construct and lock
     _Pmtx->lock();
     _Owns = true;
 }

 _NODISCARD_CTOR_LOCK unique_lock(_Mutex& _Mtx, adopt_lock_t) noexcept // strengthened
     : _Pmtx(_STD addressof(_Mtx)), _Owns(true) {} // construct and assume already locked

 unique_lock(_Mutex& _Mtx, defer_lock_t) noexcept
     : _Pmtx(_STD addressof(_Mtx)), _Owns(false) {} // construct but don't lock
  • 默認情況下,不會立即鎖定互斥鎖(需要手動調(diào)用 lock())。
  • 如果傳遞了 std::defer_lock,表示延遲鎖定,需要手動調(diào)用 lock()。
  • 如果傳遞了 std::adopt_lock,表示互斥鎖已經(jīng)被當前線程鎖定,std::unique_lock 只負責管理鎖的釋放。

三、解鎖能力

3.1 std::lock_guard

  • 不支持手動解鎖?;コ怄i只能在 std::lock_guard 對象析構時自動解鎖。

3.2 std::unique_lock

  • 支持手動解鎖??梢酝ㄟ^調(diào)用 unlock() 方法手動釋放互斥鎖,也可以在析構時自動解鎖。
  • 代碼示例
std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // 延遲鎖定
lock.lock(); // 手動鎖定
lock.unlock(); // 手動解鎖

四、與條件變量的配合

4.1 std::lock_guard 

  • 由于不支持手動解鎖,因此不能與條件變量配合使用。條件變量需要在等待時釋放互斥鎖,并在被喚醒后重新鎖定。

4.2 std::unique_lock 

  • 與條件變量配合使用時非常方便。std::unique_lock 可以在等待條件變量時手動解鎖互斥鎖,并在條件變量被喚醒后重新鎖定。
#include<thread>
#include<mutex>
#include<condition_variable>
std::mutex mt;
std::condition_variable cv;
bool bReady = false;
// 生產(chǎn)者
void producer()
{
    // 構造lock對象時,鎖定
    std::unique_lock<std::mutex> lock(mt);
   // Do Something
    ... 
    // 解鎖
    lock.unlock();
   
    // 通知消費者
    cv.notify_one();
}

void customer()
{
    // 構造lock對象時,鎖定
    std::unique_lock<std::mutex> lock(mt);
    // 條件變量等待時自動解鎖和重新鎖定
    cv.wait(lock,[]{return bReady;});
    // 繼續(xù)處理
}

五、性能和開銷

  • std::lock_guard
    • 由于功能簡單,通常比 std::unique_lock 更輕量級,生成的代碼可能更高效。
  • std::unique_lock
    • 功能更復雜,可能帶來一些額外的開銷,但這種開銷在大多數(shù)情況下是可以忽略的。

總結

  • 如果你只需要在某個作用域內(nèi)簡單地鎖定和解鎖互斥鎖,且不需要中途解鎖,那么 std::lock_guard 是更好的選擇。
  • 如果你需要更靈活地控制鎖的鎖定和解鎖,或者需要與條件變量配合使用,那么 std::unique_lock 是更合適的選擇。

到此這篇關于C++ 11中l(wèi)ock_guard和unique_lock的區(qū)別的文章就介紹到這了,更多相關C++ 11 lock_guard和unique_lock 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • Qt使用QCamera實現(xiàn)切換相機,分辨率和圖像捕獲功能

    Qt使用QCamera實現(xiàn)切換相機,分辨率和圖像捕獲功能

    這篇文章主要為大家介紹了如何利用Qt中的相機類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture實現(xiàn)切換相機、分辨率和圖像捕獲功能,需要的可以了解一下
    2023-04-04
  • C++ std:map的使用方法

    C++ std:map的使用方法

    std::map是C++標準庫中一個強大而高效的關聯(lián)容器,本文就來介紹一下C++ std:map的使用方法,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • swift Character類型詳解及實例

    swift Character類型詳解及實例

    這篇文章主要介紹了 swift Character類型詳解及實例的相關資料,需要的朋友可以參考下
    2017-06-06
  • Qt項目實戰(zhàn)之實現(xiàn)多文本編輯器

    Qt項目實戰(zhàn)之實現(xiàn)多文本編輯器

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)簡易的多文本編輯器,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • 利用反射獲得類的public static/const成員的值實例

    利用反射獲得類的public static/const成員的值實例

    下面小編就為大家?guī)硪黄梅瓷浍@得類的public static/const成員的值實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C/C++實現(xiàn)投骰子游戲

    C/C++實現(xiàn)投骰子游戲

    這篇文章主要為大家詳細介紹了C/C++實現(xiàn)投骰子游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++實現(xiàn)簡易圖書館管理系統(tǒng)

    C++實現(xiàn)簡易圖書館管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡易圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Trae+Qt+MSVC環(huán)境配置的實現(xiàn)示例

    Trae+Qt+MSVC環(huán)境配置的實現(xiàn)示例

    本文主要介紹了Trae+Qt+MSVC環(huán)境配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • 淺析C語言頭文件和庫的一些問題

    淺析C語言頭文件和庫的一些問題

    以下是對C語言中頭文件和庫的一些問題進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C語言整形提升舉例詳解

    C語言整形提升舉例詳解

    對于整形提升,高位需要補位,那么補什么呢,無符號數(shù)高位補0,有符號數(shù)高位補1,下面這篇文章主要給大家介紹了關于C語言整形提升的相關資料,需要的朋友可以參考下
    2023-01-01

最新評論

兴业县| 喀喇| 清原| 凤山县| 玉林市| 城口县| 隆林| 阿克苏市| 兖州市| 松阳县| 阿城市| 兴隆县| 云安县| 鄢陵县| 商城县| 绥棱县| 肇东市| 白山市| 永胜县| 漳浦县| 定州市| 南溪县| 延寿县| 徐闻县| 大厂| 金阳县| 长海县| 台山市| 仁布县| 长岭县| 谷城县| 台北市| 宜宾县| 宁南县| 无极县| 岳西县| 永和县| 上蔡县| 郯城县| 长寿区| 分宜县|