51 rindas
978 B

//
// Created by 马也驰 on 2024/12/28.
//
#ifndef LEVELDB_SHARED_LOCK_H
#define LEVELDB_SHARED_LOCK_H
#include <mutex>
class SharedLock {
public:
SharedLock() : read_count_(0) {}
public:
void soft_lock() {
write_latch_.lock();
read_count_latch_.lock();
if (!read_count_) {
read_latch_.lock();
}
read_count_ ++;
read_count_latch_.unlock();
write_latch_.unlock();
}
void soft_unlock() {
read_count_latch_.lock();
read_count_ --;
if (!read_count_) {
read_latch_.unlock();
}
read_count_latch_.unlock();
}
void hard_lock() {
read_latch_.lock();
write_latch_.lock();
read_latch_.unlock();
}
void hard_unlock() {
write_latch_.unlock();
}
private:
std::mutex read_latch_; // indicate if any read is proceeding
std::mutex read_count_latch_;
volatile size_t read_count_;
std::mutex write_latch_; // indicate if any write is proceeding
};
#endif // LEVELDB_SHARED_LOCK_H