upd: write class ReadWriteLock

This commit is contained in:
2023-12-12 04:10:17 +00:00
parent 8426db0da1
commit b937a94bd8
2 changed files with 43 additions and 0 deletions

View File

@ -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<int> login_stack;
std::string SessionToken;

View File

@ -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<std::mutex> lock(mtx);
cv.wait(lock, [this] { return !is_writing; }); // 等待写操作结束
readers++;
}
void ReadWriteLock::endRead() {
std::unique_lock<std::mutex> lock(mtx);
readers--;
if (readers == 0) {
cv.notify_one(); // 唤醒一个等待的写操作
}
}
void ReadWriteLock::startWrite() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this] {
return readers == 0 && !is_writing;
}); // 等待读操作和写操作结束
is_writing = true;
}
void ReadWriteLock::endWrite() {
std::unique_lock<std::mutex> lock(mtx);
is_writing = false;
cv.notify_all(); // 唤醒所有等待的读操作和写操作
}