小工具知识网

当前位置: 首页 > 行业知识 > C++读写锁

行业知识

C++读写锁

2026-11-12 14:07:26 来源:互联网转载

使用条件变量实现读写锁

// 思路:// 信号量和互斥锁的搭配进行读写锁的设计://读锁:// 请求读锁时,如果writer是false,说明现在无写者,因此可以读者++// 释放读锁,--读者,当读者为0的时候,通知写者可以获取锁了// 写锁:// 写者加锁,等待reader为0把writer设设置true;// 释放写锁:加锁: writer设置为false;然后通知读条件变量和写条件变量进行class RWlock{public:    RWlock():readers(0), writer(false){}    void acquireReadLock(){        // 请求读锁        std::unique_lock lock(mutexlock);        readcondition.wait(lock, [this](){            return !writer;        });        ++readers;    }    void releaseReadLock(){        std::unique_lock lock(mutexlock);        --readers;        if(readers == 0){            // 没有读者了,通知写者进行开始工作了            writerCondition.notify_one(); // 由于读者不会因为这个原因卡。        }    }    void acquireWriteLock(){        std::unique_lock lock(mutexlock);        writerCondition.wait(lock, [this](){return readers == 0;});        writer = true;    }    void releaseWriteLock(){        std::unique_lock 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;};

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

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

实现写优先

class ReadWriteLock{public:    ReadWriteLock():readCount(0), writeCount(0){}        void acquireReadLock(){        std::unique_lock lock(mutexLock);        readCondition.wait(lock, [this](){            return writeCount == 0;        });        ++readCount;    }        void releaseReadLock(){        std::unique_lock lock(mutexLock);        --readCount;        if(readCount == 0){// 写者被唤醒            writeCondition.notify_one();        }    }        void acquireWriteLock(){        std::unique_lock lock(mutexLock);        ++writeCount;        writeCondition.wait(lock, [this](){return readCount == 0 and !isWriting;});        isWriting = true;    }        void releaseWriteLock(){        std::unique_lock 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;};
()()

上一篇:揭秘LRC文件,歌词文件的秘密与实用之处

下一篇:传奇服务器怎么刷装备的?