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;
};
相关推荐
码路飞4 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing4 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven976 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德17 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆19 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌21 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
blasit1 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
华仔啊1 天前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang1 天前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang1 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计