• 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
  • 相关阅读:
    我找到了一个快速定位SpringBoot接口超时问题的神器
    【Maven】<dependencyManagement>详解
    如何应对反爬机制?解密常见防护手段及破解方法
    c++继承
    HTML如何设置引文与特色元素
    Java基础 对象创建流程
    Kotlin 数据类(Data Class)
    学生HTML个人网页作业作品 HTML+CSS校园环保(大学生环保网页设计与实现)
    【Azure】微软 Azure 基础解析(九)Azure 标识、身份管理、Azure AD 的功能与用途
    第七章 网络安全 | 计算机网络(谢希仁 第八版)
  • 原文地址:https://blog.csdn.net/Tmicen/article/details/136572330