Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ReadLock -- ReadUnlock
- // WriteLock -- WriteUnlock
- // read priority
- private:
- std::condition_variable can_read_, can_write_;
- std::atomic<int> readers_;
- std::atomic<bool> locked_;
- public:
- WriteLock() {
- std::unique_lock<std::mutex> lock;
- while(locked_) {
- can_write_.wait(lock);
- }
- locked_.store(true);
- while (readers_.load() != 0)
- can_write_.wait(lock);
- }
- ReadLock() {
- std::unique_lock <std::mutex> lock;
- while(locked_) {
- can_read_.wait(lock);
- }
- readers_.fetch_add(1);
- }
- WriteUnlock() {
- if (readers_.load() != 0) {
- can_read_.notify_one();
- } else {
- can_write_.notify_one();
- }
- locked_.store(false);
- }
- ReadUnlock() {
- if (readers_.fetch_add(-1) != 0) {
- can_read_.notify_one();
- } else {
- can_write_.notify_one();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement