C++读写锁

使用条件变量实现读写锁

cpp 复制代码
// 思路:
// 信号量和互斥锁的搭配进行读写锁的设计:
//读锁:
// 请求读锁时,如果writer是false,说明现在无写者,因此可以读者++
// 释放读锁,--读者,当读者为0的时候,通知写者可以获取锁了
// 写锁:
// 写者加锁,等待reader为0把writer设设置true;
// 释放写锁:加锁: writer设置为false;然后通知读条件变量和写条件变量进行


class RWlock{
public:
    RWlock():readers(0), writer(false){}

    void acquireReadLock(){
        // 请求读锁
        std::unique_lock<std::mutex> lock(mutexlock);
        readcondition.wait(lock, [this](){
            return !writer;
        });
        ++readers;
    }

    void releaseReadLock(){
        std::unique_lock<std::mutex> lock(mutexlock);
        --readers;
        if(readers == 0){
            // 没有读者了,通知写者进行开始工作了
            writerCondition.notify_one(); // 由于读者不会因为这个原因卡。
        }
    }

    void acquireWriteLock(){
        std::unique_lock<std::mutex> lock(mutexlock);
        writerCondition.wait(lock, [this](){return readers == 0;});
        writer = true;
    }
    void releaseWriteLock(){
        std::unique_lock<std::mutex> lock(mutexlock);
        writer = false;
        readcondition.notify_all();
        // 也就是说条件变量必须通知
        writerCondition.notify_one();
    }

private:
    std::mutex mutexlock;
    std::condition_variable readcondition;
    std::condition_variable writerCondition;
    int readers = 0;
    bool writer = false;

};

使用两个互斥锁实现读写锁

cpp 复制代码
#include<iostream>
#include <thread>
#include <mutex>
// 思路是:
// 读者使用计数器计数,等到readcount == 1的时候写者锁上
// readcount == 0 的时候,写者解锁。
class ReadWriteLock{
public:
    ReadWriteLock():readCount(0){}
    void acquireReadLock(){
        std::unique_lock<std::mutex> lock(readMutex);
        ++readCount;
        if(readCount == 1){
            // 存在读者就将write上锁
            writeMutex.lock(); // 不允许写者加锁写者上锁
        }
    }
    void releaseReadLock(){
        // 这个怎么进行释放呢
        std::unique_lock<std::mutex> lock(readMutex);
        --readCount;
        if(readCount == 0){
            writeMutex.unlock(); // 允许读者加锁
        }
    }

    // 实现写锁
    void acquireWriteLock(){
        // 如何获取写锁
        writeMutex.lock();
    }
    void releaseWriteLock(){
        writeMutex.unlock();
    }
private:
    std::mutex readMutex;
    std::mutex writeMutex;
    int readCount;
};

实现写优先

cpp 复制代码
class ReadWriteLock{
public:
    ReadWriteLock():readCount(0), writeCount(0){}
    
    void acquireReadLock(){
        std::unique_lock<std::mutex> lock(mutexLock);
        readCondition.wait(lock, [this](){
            return writeCount == 0;
        });
        ++readCount;
    }
    
    void releaseReadLock(){
        std::unique_lock<std::mutex> lock(mutexLock);
        --readCount;
        if(readCount == 0){// 写者被唤醒
            writeCondition.notify_one();
        }
    }
    
    void acquireWriteLock(){
        std::unique_lock<std::mutex> lock(mutexLock);
        ++writeCount;
        writeCondition.wait(lock, [this](){return readCount == 0 and !isWriting;});
        isWriting = true;
    }
    
    void releaseWriteLock(){
        std::unique_lock<std::mutex> lock(mutexLock);
        --writeCount;
        isWriting = false;
        readCondition.notify_all();
        writeCondition.notify_one();
    }
    
private:
    std::mutex mutexLock;
    std::condition_variable readCondition;
    std::condition_variable writeCondition;
    int readCount = 0;
    int writeCount = 0;
    bool isWriting;
};
相关推荐
saltymilk8 小时前
C++ 模板参数推导问题小记(模板类的模板构造函数)
c++·模板元编程
感哥8 小时前
C++ lambda 匿名函数
c++
RainbowSea9 小时前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea9 小时前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程
考虑考虑13 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613513 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊14 小时前
Java学习第22天 - 云原生与容器化
java
沐怡旸14 小时前
【底层机制】std::unique_ptr 解决的痛点?是什么?如何实现?怎么正确使用?
c++·面试
感哥15 小时前
C++ 内存管理
c++
渣哥16 小时前
原来 Java 里线程安全集合有这么多种
java