C++?實(shí)現(xiàn)讀寫鎖的代碼詳解
下面是一個(gè)簡(jiǎn)單的 C++ 實(shí)現(xiàn)讀寫鎖的示例:
#include <iostream> #include <mutex> #include <condition_variable> class ReadWriteLock { private: std::mutex mutex_; std::condition_variable read_cv_; std::condition_variable write_cv_; int readers_; bool writing_; public: ReadWriteLock() : readers_(0), writing_(false) {} void lockRead() { std::unique_lock<std::mutex> lock(mutex_); // 如果有線程正在進(jìn)行寫操作或者等待寫操作,則阻塞等待 while (writing_) { read_cv_.wait(lock); } readers_++; } void unlockRead() { std::unique_lock<std::mutex> lock(mutex_); readers_--; if (readers_ == 0) { write_cv_.notify_one(); // 喚醒等待寫操作的線程 } } void lockWrite() { std::unique_lock<std::mutex> lock(mutex_); // 如果有線程正在讀或?qū)?,則阻塞等待 while (writing_ || readers_ > 0) { write_cv_.wait(lock); } writing_ = true; } void unlockWrite() { std::unique_lock<std::mutex> lock(mutex_); writing_ = false; read_cv_.notify_all(); // 喚醒等待讀操作的線程 write_cv_.notify_one(); // 喚醒等待寫操作的線程 } }; // 示例用法 ReadWriteLock rwLock; void readerFunction(int id) { while (true) { rwLock.lockRead(); // 執(zhí)行讀取操作 std::cout << "Reader " << id << " is reading" << std::endl; rwLock.unlockRead(); // 休眠一段時(shí)間模擬讀取過程 std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } } void writerFunction(int id) { while (true) { rwLock.lockWrite(); // 執(zhí)行寫入操作 std::cout << "Writer " << id << " is writing" << std::endl; rwLock.unlockWrite(); // 休眠一段時(shí)間模擬寫入過程 std::this_thread::sleep_for(std::chrono::milliseconds(2000)); } } int main() { // 創(chuàng)建多個(gè)讀者線程和寫者線程進(jìn)行測(cè)試 std::thread readers[3]; std::thread writers[2]; for (int i = 0; i < 3; i++) { readers[i] = std::thread(readerFunction, i); } for (int i = 0; i < 2; i++) { writers[i] = std::thread(writerFunction, i); } // 等待所有線程結(jié)束 for (auto& reader : readers) { reader.join(); } for (auto& writer : writers) { writer.join(); } return 0; }
在上述示例中,ReadWriteLock
類實(shí)現(xiàn)了讀寫鎖的基本功能。lockRead()
和 unlockRead()
方法用于獲取和釋放讀鎖,lockWrite()
和 unlockWrite()
方法用于獲取和釋放寫鎖。
在主函數(shù)中,創(chuàng)建了多個(gè)讀者線程和寫者線程來模擬并發(fā)讀寫操作。讀者線程使用 lockRead()
和 unlockRead()
獲取和釋放讀鎖,寫者線程使用 lockWrite()
和 unlockWrite()
獲取和釋放寫鎖。
通過使用互斥量(std::mutex
)、條件變量(std::condition_variable
)以及共享的計(jì)數(shù)器和標(biāo)志位來實(shí)現(xiàn)讀寫鎖的功能,并確保讀者和寫者之間的互斥和同步。
到此這篇關(guān)于C++ 實(shí)現(xiàn)讀寫鎖的代碼詳解的文章就介紹到這了,更多相關(guān)C++ 實(shí)現(xiàn)讀寫鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)職工工資管理系統(tǒng)的示例代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何實(shí)現(xiàn)職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C語(yǔ)言實(shí)現(xiàn)打飛機(jī)小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的打飛機(jī)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02c++?qt自定義搜索編輯框的實(shí)現(xiàn)方法
這篇文章主要介紹了c++?qt自定義搜索編輯框,通過自定義QLineEdit,在編輯框里添加布局,將按鈕設(shè)置在右邊,當(dāng)點(diǎn)擊按鈕搜索按鈕時(shí)發(fā)送信號(hào)到主界面做相應(yīng)的操作,需要的朋友可以參考下2022-03-03基于C語(yǔ)言char與unsigned char的區(qū)別介紹
本篇文章小編為大家介紹,基于C語(yǔ)言char與unsigned char的區(qū)別介紹。需要的朋友參考下2013-04-04

C語(yǔ)言 fscanf 和 fprintf函數(shù)示例詳解