您好,登錄后才能下訂單哦!
這篇“C++的std::shared_mutex讀寫鎖怎么使用”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++的std::shared_mutex讀寫鎖怎么使用”文章吧。
讀寫鎖把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進(jìn)行讀訪問,寫者則需要對共享資源進(jìn)行寫操作。C++17開始,標(biāo)準(zhǔn)庫提供了shared_mutex類(在這之前,可以使用boost的shared_mutex類或系統(tǒng)相關(guān)api)。和其他便于獨(dú)占訪問的互斥類型不同,shared_mutex 擁有兩個訪問級別:
共享:多個線程能共享同一互斥的所有權(quán)(如配合shared_lock);
獨(dú)占:僅有一個線程能占有互斥(如配合lock_guard、unique_lock)。
shared_mutex 通常用于多個讀線程能同時訪問同一資源而不導(dǎo)致數(shù)據(jù)競爭,但只有一個寫線程能訪問的情形。
通過查看該類的接口,可以看到,該類除了互斥鎖定接口,還提供了共享鎖定接口。
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() ,則行為未定義。若多于實(shí)現(xiàn)定義最大數(shù)量的共享所有者已以共享模式鎖定互斥,則 shared_lock() 阻塞執(zhí)行,直至共享所有者的數(shù)量減少。所有者的最大數(shù)量保證至少為 10000 ??梢杂胹td::shared_lock管理共享鎖定。
這里直接借用在線手冊上的例子:
#include <iostream> //std::unique_lock #include <mutex> #include <shared_mutex> #include <thread> class ThreadSafeCounter { public: ThreadSafeCounter() = default; // 多個線程/讀者能同時讀計(jì)數(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讀寫鎖怎么使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。