C++ std::shared_mutex讀寫(xiě)鎖的使用
0.前言
讀寫(xiě)鎖把對(duì)共享資源的訪(fǎng)問(wèn)者劃分成讀者和寫(xiě)者,讀者只對(duì)共享資源進(jìn)行讀訪(fǎng)問(wèn),寫(xiě)者則需要對(duì)共享資源進(jìn)行寫(xiě)操作。C++17開(kāi)始,標(biāo)準(zhǔn)庫(kù)提供了shared_mutex類(lèi)(在這之前,可以使用boost的shared_mutex類(lèi)或系統(tǒng)相關(guān)api)。和其他便于獨(dú)占訪(fǎng)問(wèn)的互斥類(lèi)型不同,shared_mutex 擁有兩個(gè)訪(fǎng)問(wèn)級(jí)別:
- 共享:多個(gè)線(xiàn)程能共享同一互斥的所有權(quán)(如配合shared_lock);
- 獨(dú)占:僅有一個(gè)線(xiàn)程能占有互斥(如配合lock_guard、unique_lock)。
shared_mutex 通常用于多個(gè)讀線(xiàn)程能同時(shí)訪(fǎng)問(wèn)同一資源而不導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng),但只有一個(gè)寫(xiě)線(xiàn)程能訪(fǎng)問(wèn)的情形。
1.認(rèn)識(shí)std::shared_mutex
通過(guò)查看該類(lèi)的接口(https://zh.cppreference.com/w/cpp/thread/shared_mutex),可以看到,該類(lèi)除了互斥鎖定接口,還提供了共享鎖定接口。

- lock() 鎖定互斥。若另一線(xiàn)程已鎖定互斥,則到 lock() 的調(diào)用將阻塞執(zhí)行,直至獲得鎖??梢杂?std::lock_guard 和 std::unique_lock 管理互斥鎖定。
- shared_lock() 獲得互斥的共享所有權(quán)。若另一線(xiàn)程以排他性所有權(quán)保有互斥,則到 shared_lock() 的調(diào)用將阻塞執(zhí)行,直到能取得共享所有權(quán)。若已以任何模式(排他性或共享)占有 mutex 的線(xiàn)程調(diào)用 shared_lock() ,則行為未定義。若多于實(shí)現(xiàn)定義最大數(shù)量的共享所有者已以共享模式鎖定互斥,則 shared_lock() 阻塞執(zhí)行,直至共享所有者的數(shù)量減少。所有者的最大數(shù)量保證至少為 10000 。可以用std::shared_lock管理共享鎖定。
2.實(shí)例演示
這里直接借用在線(xiàn)手冊(cè)上的例子:
#include <iostream>
//std::unique_lock
#include <mutex>
#include <shared_mutex>
#include <thread>
class ThreadSafeCounter {
public:
ThreadSafeCounter() = default;
// 多個(gè)線(xiàn)程/讀者能同時(shí)讀計(jì)數(shù)器的值。
unsigned int get() const {
std::shared_lock<std::shared_mutex> lock(mutex_);
return value_;
}
// 只有一個(gè)線(xiàn)程/寫(xiě)者能增加/寫(xiě)線(xiàn)程的值。
void increment() {
std::unique_lock<std::shared_mutex> lock(mutex_);
value_++;
}
// 只有一個(gè)線(xiàn)程/寫(xiě)者能重置/寫(xiě)線(xiàn)程的值。
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讀寫(xiě)鎖的使用的文章就介紹到這了,更多相關(guān)C++ std::shared_mutex讀寫(xiě)鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)將數(shù)據(jù)寫(xiě)入Excel工作表的示例代碼
直觀的界面、出色的計(jì)算功能和圖表工具,使Excel成為最流行的個(gè)人計(jì)算機(jī)數(shù)據(jù)處理軟件。在本文中,您將學(xué)習(xí)如何使用?Spire.XLS?for?C++?創(chuàng)建?Excel?文檔,以及如何將數(shù)據(jù)寫(xiě)入?Excel?工作表2023-03-03
C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[三]
C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[三]...2007-02-02
一文帶你掌握C++中的移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)
這篇文章主要為大家詳細(xì)介紹了C++中的移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入掌握C++有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
C++ 實(shí)現(xiàn)即時(shí)通信的示例代碼(直接運(yùn)行)
本文主要介紹了C++ 實(shí)現(xiàn)即時(shí)通信的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
QT調(diào)用vs2019生成的c++動(dòng)態(tài)庫(kù)的方法實(shí)現(xiàn)
本文主要介紹了QT調(diào)用vs2019生成的c++動(dòng)態(tài)庫(kù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06

