欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ std::shared_mutex讀寫鎖的使用

 更新時間:2022年03月15日 14:31:51   作者:龔建波  
本文主要介紹了C++ std::shared_mutex讀寫鎖的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

0.前言

讀寫鎖把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進(jìn)行讀訪問,寫者則需要對共享資源進(jìn)行寫操作。C++17開始,標(biāo)準(zhǔn)庫提供了shared_mutex類(在這之前,可以使用boost的shared_mutex類或系統(tǒng)相關(guān)api)。和其他便于獨占訪問的互斥類型不同,shared_mutex 擁有兩個訪問級別:

  • 共享:多個線程能共享同一互斥的所有權(quán)(如配合shared_lock);
  • 獨占:僅有一個線程能占有互斥(如配合lock_guard、unique_lock)。

shared_mutex 通常用于多個讀線程能同時訪問同一資源而不導(dǎo)致數(shù)據(jù)競爭,但只有一個寫線程能訪問的情形。

1.認(rèn)識std::shared_mutex

通過查看該類的接口(https://zh.cppreference.com/w/cpp/thread/shared_mutex),可以看到,該類除了互斥鎖定接口,還提供了共享鎖定接口。

  • lock() 鎖定互斥。若另一線程已鎖定互斥,則到 lock() 的調(diào)用將阻塞執(zhí)行,直至獲得鎖??梢杂?std::lock_guard 和 std::unique_lock 管理互斥鎖定。
  • shared_lock() 獲得互斥的共享所有權(quán)。若另一線程以排他性所有權(quán)保有互斥,則到 shared_lock() 的調(diào)用將阻塞執(zhí)行,直到能取得共享所有權(quán)。若已以任何模式(排他性或共享)占有 mutex 的線程調(diào)用 shared_lock() ,則行為未定義。若多于實現(xiàn)定義最大數(shù)量的共享所有者已以共享模式鎖定互斥,則 shared_lock() 阻塞執(zhí)行,直至共享所有者的數(shù)量減少。所有者的最大數(shù)量保證至少為 10000 。可以用std::shared_lock管理共享鎖定。

2.實例演示

這里直接借用在線手冊上的例子:

#include <iostream>
//std::unique_lock
#include <mutex> 
#include <shared_mutex>
#include <thread>
 
class ThreadSafeCounter {
public:
    ThreadSafeCounter() = default;
 
    // 多個線程/讀者能同時讀計數(shù)器的值。
    unsigned int get() const {
        std::shared_lock<std::shared_mutex> lock(mutex_);
        return value_;
    }
 
    // 只有一個線程/寫者能增加/寫線程的值。
    void increment() {
        std::unique_lock<std::shared_mutex> lock(mutex_);
        value_++;
    }
 
    // 只有一個線程/寫者能重置/寫線程的值。
    void reset() {
        std::unique_lock<std::shared_mutex> lock(mutex_);
        value_ = 0;
    }
 
private:
    mutable std::shared_mutex mutex_;
    unsigned int value_ = 0;
};
 
int main() {
    ThreadSafeCounter counter;
 
    auto increment_and_print = [&counter]() {
        for (int i = 0; i < 3; i++) {
            counter.increment();
            std::cout << std::this_thread::get_id() << '\t' << counter.get() << std::endl;
        }
    };
 
    std::thread thread1(increment_and_print);
    std::thread thread2(increment_and_print);
 
    thread1.join();
    thread2.join();
 
    system("pause");
    return 0;
}

到此這篇關(guān)于C++ std::shared_mutex讀寫鎖的使用的文章就介紹到這了,更多相關(guān)C++ std::shared_mutex讀寫鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT中在QLabel顯示圖片并且利用鼠標(biāo)點擊畫線問題

    QT中在QLabel顯示圖片并且利用鼠標(biāo)點擊畫線問題

    這篇文章主要介紹了QT中在QLabel顯示圖片并且利用鼠標(biāo)點擊畫線問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++中的各種容器的使用方法匯總

    C++中的各種容器的使用方法匯總

    這篇文章主要介紹了C++中的各種容器的使用方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • C 語言實現(xiàn)一個簡單的 web 服務(wù)器的原理解析

    C 語言實現(xiàn)一個簡單的 web 服務(wù)器的原理解析

    這篇文章主要介紹了C 語言實現(xiàn)一個簡單的 web 服務(wù)器的原理解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • C++集體數(shù)據(jù)交換實現(xiàn)示例講解

    C++集體數(shù)據(jù)交換實現(xiàn)示例講解

    這篇文章主要介紹了C++集體數(shù)據(jù)交換實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • Win10中VC2013安裝Unit test組件出現(xiàn)問題解決方案

    Win10中VC2013安裝Unit test組件出現(xiàn)問題解決方案

    本文給大家分享的是個人在Win10中VC2013安裝Unit test組件出現(xiàn)問題并最終找到解決辦法的過程,有需要的小伙伴可以參考下
    2016-03-03
  • C++?Boost?Assign超詳細(xì)講解

    C++?Boost?Assign超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-12-12
  • 深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)LeetCode(77.Combinations 組合項)

    C++實現(xiàn)LeetCode(77.Combinations 組合項)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(Combinations 組合項),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt向ini文件寫入中文出現(xiàn)亂碼問題的解決方法詳解

    Qt向ini文件寫入中文出現(xiàn)亂碼問題的解決方法詳解

    這篇文章主要為大家詳細(xì)介紹了當(dāng)Qt向ini文件寫入中文出現(xiàn)亂碼問題時的解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 使用C語言操作樹莓派GPIO的詳細(xì)步驟

    使用C語言操作樹莓派GPIO的詳細(xì)步驟

    今天抽空給大家普及使用C語言操作樹莓派GPIO的詳細(xì)步驟,本文大概分五步給大家介紹樹莓派GPIO安裝步驟,首先需要安裝GPIO庫然后進(jìn)行一步步設(shè)置,具體操作方法跟隨小編一起學(xué)習(xí)吧
    2021-06-06

最新評論