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

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

 更新時(shí)間:2023年10月19日 08:46:09   作者:Respect@  
C++讀寫鎖是一種多線程同步機(jī)制,它允許多個(gè)線程同時(shí)讀取共享數(shù)據(jù),但只允許一個(gè)線程寫入共享數(shù)據(jù),這種鎖可以提高程序的并發(fā)性和性能,本文給大家介紹了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)文章

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

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

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

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

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

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

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