亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2025年07月14日 10:06:17   作者:追烽少年x  
在C++11中,std::lock_guard 和 std::unique_lock 都是用于管理互斥鎖的RAII類,但它們?cè)诠δ芎褪褂脠?chǎng)景上有一些重要的區(qū)別,下面就來(lái)介紹一下兩者的區(qū)別,感興趣的可以了解一下

在C++11中,std::lock_guardstd::unique_lock 都是用于管理互斥鎖(std::mutex 或其他互斥鎖類型)的RAII(資源獲取即初始化)類,但它們?cè)诠δ芎褪褂脠?chǎng)景上有一些重要的區(qū)別。以下是它們的主要區(qū)別:

一、功能設(shè)計(jì)

1.1 std::lock_guard

功能單一std::lock_guard 的唯一目的是在構(gòu)造時(shí)鎖定互斥鎖,并在析構(gòu)時(shí)釋放互斥鎖。它不支持手動(dòng)解鎖。

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

代碼示例

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

1.2 std::unique_lock 

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

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

代碼示例

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

二、構(gòu)造方式

2.1 std::lock_guard 

  • 構(gòu)造時(shí)必須傳遞一個(gè)互斥鎖對(duì)象,并且會(huì)立即鎖定該互斥鎖。

構(gòu)造函數(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
  • 默認(rèn)情況下,會(huì)立即鎖定互斥鎖。
  • 如果傳遞了 std::adopt_lock,表示互斥鎖已經(jīng)被當(dāng)前線程鎖定,std::lock_guard 只負(fù)責(zé)管理鎖的釋放。

2.2 std::unique_lock

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

構(gòu)造函數(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
  • 默認(rèn)情況下,不會(huì)立即鎖定互斥鎖(需要手動(dòng)調(diào)用 lock())。
  • 如果傳遞了 std::defer_lock,表示延遲鎖定,需要手動(dòng)調(diào)用 lock()。
  • 如果傳遞了 std::adopt_lock,表示互斥鎖已經(jīng)被當(dāng)前線程鎖定,std::unique_lock 只負(fù)責(zé)管理鎖的釋放。

三、解鎖能力

3.1 std::lock_guard

  • 不支持手動(dòng)解鎖?;コ怄i只能在 std::lock_guard 對(duì)象析構(gòu)時(shí)自動(dòng)解鎖。

3.2 std::unique_lock

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

四、與條件變量的配合

4.1 std::lock_guard 

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

4.2 std::unique_lock 

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

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

五、性能和開(kāi)銷

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

總結(jié)

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

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

相關(guān)文章

  • C語(yǔ)言控制臺(tái)打磚塊小游戲

    C語(yǔ)言控制臺(tái)打磚塊小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言控制臺(tái)打磚塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言中的奇技淫巧

    C語(yǔ)言中的奇技淫巧

    學(xué)習(xí)C語(yǔ)言的過(guò)程中,總會(huì)遇到很多令人眼前一亮的代碼,尤其是你寫(xiě)了幾十行的代碼,別人只用了簡(jiǎn)單幾行的遞歸就實(shí)現(xiàn)的功能。下面我就總結(jié)幾個(gè)C語(yǔ)言中 比較新手向的代碼。讓你有一種woc!還能這么寫(xiě)的想法
    2018-08-08
  • C++實(shí)現(xiàn)查找二叉樹(shù)中和為某一值的所有路徑的示例

    C++實(shí)現(xiàn)查找二叉樹(shù)中和為某一值的所有路徑的示例

    這篇文章主要介紹了C++實(shí)現(xiàn)查找二叉樹(shù)中和為某一值的所有路徑的示例,文中的方法是根據(jù)數(shù)組生成二叉排序樹(shù)并進(jìn)行遍歷,需要的朋友可以參考下
    2016-02-02
  • C語(yǔ)言二級(jí)指針與多級(jí)指針的實(shí)現(xiàn)

    C語(yǔ)言二級(jí)指針與多級(jí)指針的實(shí)現(xiàn)

    本文主要介紹了C語(yǔ)言二級(jí)指針與多級(jí)指針的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • C++ decltype用法舉例說(shuō)明

    C++ decltype用法舉例說(shuō)明

    decltype是C++11添加的一個(gè)新的關(guān)鍵字,目的是選擇并返回操作數(shù)的數(shù)據(jù)類型,重要的是,在此過(guò)程中編譯器分析表達(dá)式并得到它的類型,卻不實(shí)際計(jì)算表達(dá)式的值,今天通過(guò)本文給大家介紹C++ decltype用法,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)

    C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++實(shí)現(xiàn)掃雷游戲(控制臺(tái)不閃屏版)

    C++實(shí)現(xiàn)掃雷游戲(控制臺(tái)不閃屏版)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷游戲,控制臺(tái)不閃屏版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語(yǔ)言實(shí)現(xiàn)無(wú)頭單向鏈表的示例代碼

    C語(yǔ)言實(shí)現(xiàn)無(wú)頭單向鏈表的示例代碼

    本文主要介紹了C語(yǔ)言實(shí)現(xiàn)無(wú)頭單向鏈表的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • c語(yǔ)言實(shí)現(xiàn)MD5算法的項(xiàng)目實(shí)踐

    c語(yǔ)言實(shí)現(xiàn)MD5算法的項(xiàng)目實(shí)踐

    MD5用于確保信息傳輸完整一致,是計(jì)算機(jī)廣泛使用的雜湊算法之一,本文主要介紹了c語(yǔ)言實(shí)現(xiàn)MD5算法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • C語(yǔ)言判斷數(shù)是否為素?cái)?shù)與素?cái)?shù)輸出

    C語(yǔ)言判斷數(shù)是否為素?cái)?shù)與素?cái)?shù)輸出

    大家好,本篇文章主要講的是C語(yǔ)言判斷數(shù)是否為素?cái)?shù)與素?cái)?shù)輸出,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論