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;
};
相关推荐
覆东流14 分钟前
7.Java数组
java·开发语言·后端
m0_7190841117 分钟前
限流和获取请求ip的方法
java
码行山野赴时序归途28 分钟前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
lzhdim1 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
JavaPub-rodert1 小时前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
深漂的华哥2 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
ly76892 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
落魄大学生之流水线上谋生计3 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
for_ever_love__3 小时前
python基础语法学习: 闭包
开发语言·python·学习·闭包
ly76893 小时前
Python 全面入门:从核心语法到工程实践
开发语言·python