• C++读写锁


    使用条件变量实现读写锁

    // 思路:
    // 信号量和互斥锁的搭配进行读写锁的设计:
    //读锁:
    // 请求读锁时,如果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;
    
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

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

    
    #include
    #include 
    #include 
    // 思路是:
    // 读者使用计数器计数,等到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;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    实现写优先

    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;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    共享新机遇 共谋新发展 | 蓝海创意云携元宇宙技术参展2022昆明南博会
    英语——语法——从句——定语从句——笔记
    JDK21更新特性详解
    Vue3 + TS 自动检测线上环境 内容分发部署 —— 版本热更新提醒
    一个人在家也能做自媒体,这四种类型的账号,你都知道吗?
    【机器学习Q&A】余弦相似度、余弦距离、欧式距离以及机器学习中距离的含义
    YOLOv8优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列
    AI绘画工具汇总
    已知点的经纬度坐标计算/读取DEM高程信息/海拔高度
    【2023_10_22计算机热点知识分享】:人工智能
  • 原文地址:https://blog.csdn.net/Tmicen/article/details/136572330