用vscode+copilot生成的代码:
这个读写锁允许多个读者同时访问,但是在写者访问时,其他所有读者和写者都会被阻塞。当写者释放锁后,所有等待的读者和写者都会被通知。
注意,这个实现并没有处理读者和写者的优先级,所以可能会导致写者饥饿。如果你需要处理这种情况,你可能需要使用更复杂的策略,例如引入一个等待队列来公平地处理读者和写者。
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 |
#include <mutex> #include <condition_variable> class ReadWriteLock { private: std::mutex mtx; std::condition_variable cv; int readers = 0; bool writer = false; public: void read_lock() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [this](){ return !writer; }); ++readers; } void read_unlock() { std::unique_lock<std::mutex> lock(mtx); if (--readers == 0) { cv.notify_all(); } } void write_lock() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [this](){ return !writer && readers == 0; }); writer = true; } void write_unlock() { std::unique_lock<std::mutex> lock(mtx); writer = false; cv.notify_all(); } }; |