在C++17之前没有 std::shared_mutex,因此许多开发者采用 std::mutex 与 std::condition_variable 的方式实现读写锁。不过在使用的过程中需要谨慎,确保线程安全性。为了避免死锁问题,需要优先获取读锁,再获取写锁。具体的实现可以参考以下代码:
class RWMutex {
public:
RWMutex() : writer(false), reader_count(0) {}
~RWMutex() = default;
void lock_read() {
std::unique_lock<std::mutex> lock(mutex);
while (writer) {
cond.wait(lock);
}
reader_count++;
}
void lock_write() {
std::unique_lock<std::mutex> lock(mutex);
while (writer || reader_count > 0) {
cond.wait(lock);
}
writer = true;
}
void unlock_read() {
std::unique_lock<std::mutex> lock(mutex);
reader_count--;
if (reader_count == 0) {
cond.notify_one();
}
}
void unlock_write() {
std::unique_lock<std::mutex> lock(mutex);
writer = false;
cond.notify_all();
}
private:
std::mutex mutex;
std::condition_variable cond;
bool writer;
int reader_count;
};