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

C++?實現(xiàn)讀寫鎖的代碼詳解

 更新時間:2023年10月19日 08:46:09   作者:Respect@  
C++讀寫鎖是一種多線程同步機制,它允許多個線程同時讀取共享數(shù)據(jù),但只允許一個線程寫入共享數(shù)據(jù),這種鎖可以提高程序的并發(fā)性和性能,本文給大家介紹了C++?實現(xiàn)讀寫鎖的代碼,需要的朋友可以參考下

下面是一個簡單的 C++ 實現(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_);
        // 如果有線程正在進行寫操作或者等待寫操作,則阻塞等待
        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();
        // 休眠一段時間模擬讀取過程
        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();
        // 休眠一段時間模擬寫入過程
        std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    }
}

int main() {
    // 創(chuàng)建多個讀者線程和寫者線程進行測試
    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 類實現(xiàn)了讀寫鎖的基本功能。lockRead() 和 unlockRead() 方法用于獲取和釋放讀鎖,lockWrite() 和 unlockWrite() 方法用于獲取和釋放寫鎖。

在主函數(shù)中,創(chuàng)建了多個讀者線程和寫者線程來模擬并發(fā)讀寫操作。讀者線程使用 lockRead() 和 unlockRead() 獲取和釋放讀鎖,寫者線程使用 lockWrite() 和 unlockWrite() 獲取和釋放寫鎖。

通過使用互斥量(std::mutex)、條件變量(std::condition_variable)以及共享的計數(shù)器和標志位來實現(xiàn)讀寫鎖的功能,并確保讀者和寫者之間的互斥和同步。

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

相關(guān)文章

  • C語言實現(xiàn)職工工資管理系統(tǒng)的示例代碼

    C語言實現(xiàn)職工工資管理系統(tǒng)的示例代碼

    這篇文章主要為大家詳細介紹了C語言如何實現(xiàn)職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言實現(xiàn)打飛機小游戲

    C語言實現(xiàn)打飛機小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的打飛機小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • c++?qt自定義搜索編輯框的實現(xiàn)方法

    c++?qt自定義搜索編輯框的實現(xiàn)方法

    這篇文章主要介紹了c++?qt自定義搜索編輯框,通過自定義QLineEdit,在編輯框里添加布局,將按鈕設(shè)置在右邊,當點擊按鈕搜索按鈕時發(fā)送信號到主界面做相應(yīng)的操作,需要的朋友可以參考下
    2022-03-03
  • C語言自制測色弱找方塊游戲的示例代碼

    C語言自制測色弱找方塊游戲的示例代碼

    這篇文章主要介紹了基于C語言自制測色弱找方塊的游戲。該游戲是仿照最近網(wǎng)上流行的找方塊游戲編寫的,可玩性還是挺高的,感興趣的可以了解一下
    2022-12-12
  • C++?繼承的范例講解

    C++?繼承的范例講解

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對父類的允許訪問的方法實行的過程進行重新編寫,返回值和形參都不能改變。就是對原本的父類進行重新編寫,但是外部接口不能被重寫
    2022-06-06
  • 基于C語言char與unsigned char的區(qū)別介紹

    基于C語言char與unsigned char的區(qū)別介紹

    本篇文章小編為大家介紹,基于C語言char與unsigned char的區(qū)別介紹。需要的朋友參考下
    2013-04-04
  • 詳解C++實現(xiàn)拓撲排序算法

    詳解C++實現(xiàn)拓撲排序算法

    拓撲排序是對一個有向無環(huán)圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u在線性序列中出現(xiàn)在v之前。本文將對其原理進行講解,并且用C++進行實現(xiàn)
    2021-06-06
  • 枚舉和宏的區(qū)別詳細解析

    枚舉和宏的區(qū)別詳細解析

    枚舉常量具有類型,但宏沒有類型,枚舉變量具有與普通變量相同的諸如作用域、值等性質(zhì),但宏沒有,宏不是語言的一部分,它是一種預(yù)處理替換符
    2013-09-09
  • C語言 fscanf 和 fprintf函數(shù)示例詳解

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

    這篇文章主要介紹了 C語言 fscanf 和 fprintf函數(shù)示例詳解,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-12-12
  • C++中的delete不會將操作數(shù)置0

    C++中的delete不會將操作數(shù)置0

    這篇文章主要介紹了C++中的delete不會將操作數(shù)置0的相關(guān)資料,需要的朋友可以參考下
    2016-05-05

最新評論