diff --git a/backend/include/bs-utility.h b/backend/include/bs-utility.h index 2579e88..983b647 100644 --- a/backend/include/bs-utility.h +++ b/backend/include/bs-utility.h @@ -65,7 +65,20 @@ BlockingStringStream &BlockingStringStream::operator>>(T &val) { return *this; } +class ReadWriteLock { + private: + std::mutex mtx; + std::condition_variable cv; + int readers; + bool is_writing; + public: + ReadWriteLock(); + void startRead(); + void endRead(); + void startWrite(); + void endWrite(); +}; class SessionClass { std::stack login_stack; std::string SessionToken; diff --git a/backend/src/bs-utility.cpp b/backend/src/bs-utility.cpp index b9e46b4..359b230 100644 --- a/backend/src/bs-utility.cpp +++ b/backend/src/bs-utility.cpp @@ -10,4 +10,34 @@ BlockingStringStream &BlockingStringStream::getline(std::string &str, std::getline(internalStream, str, delim); return *this; +} + +ReadWriteLock::ReadWriteLock() : readers(0), is_writing(false) {} + +void ReadWriteLock::startRead() { + std::unique_lock lock(mtx); + cv.wait(lock, [this] { return !is_writing; }); // 等待写操作结束 + readers++; +} + +void ReadWriteLock::endRead() { + std::unique_lock lock(mtx); + readers--; + if (readers == 0) { + cv.notify_one(); // 唤醒一个等待的写操作 + } +} + +void ReadWriteLock::startWrite() { + std::unique_lock lock(mtx); + cv.wait(lock, [this] { + return readers == 0 && !is_writing; + }); // 等待读操作和写操作结束 + is_writing = true; +} + +void ReadWriteLock::endWrite() { + std::unique_lock lock(mtx); + is_writing = false; + cv.notify_all(); // 唤醒所有等待的读操作和写操作 } \ No newline at end of file