diff --git a/src/CXX11_shared_spin_lock.cpp b/src/CXX11_shared_spin_lock.cpp index 44acd06..1c0ab84 100644 --- a/src/CXX11_shared_spin_lock.cpp +++ b/src/CXX11_shared_spin_lock.cpp @@ -20,7 +20,7 @@ write(false) UDPC::LockObj UDPC::SharedSpinLock::spin_read_lock() { while (true) { std::lock_guard lock(mutex); - if (!write) { + if (!write.load()) { ++read; return LockObj(selfWeakPtr, Badge{}); } @@ -29,7 +29,7 @@ UDPC::LockObj UDPC::SharedSpinLock::spin_read_lock() { UDPC::LockObj UDPC::SharedSpinLock::try_spin_read_lock() { std::lock_guard lock(mutex); - if (!write) { + if (!write.load()) { ++read; return LockObj(selfWeakPtr, Badge{}); } @@ -39,7 +39,7 @@ UDPC::LockObj UDPC::SharedSpinLock::try_spin_read_lock() { void UDPC::SharedSpinLock::read_unlock(UDPC::Badge &&badge) { if (badge.isValid) { std::lock_guard lock(mutex); - if (read > 0) { + if (read.load() > 0) { --read; badge.isValid = false; } @@ -49,8 +49,8 @@ void UDPC::SharedSpinLock::read_unlock(UDPC::Badge &&badge) { UDPC::LockObj UDPC::SharedSpinLock::spin_write_lock() { while (true) { std::lock_guard lock(mutex); - if (!write && read == 0) { - write = true; + if (!write.load() && read.load() == 0) { + write.store(true); return LockObj(selfWeakPtr, Badge{}); } } @@ -58,8 +58,8 @@ UDPC::LockObj UDPC::SharedSpinLock::spin_write_lock() { UDPC::LockObj UDPC::SharedSpinLock::try_spin_write_lock() { std::lock_guard lock(mutex); - if (!write && read == 0) { - write = true; + if (!write.load() && read.load() == 0) { + write.store(true); return LockObj(selfWeakPtr, Badge{}); } return LockObj(Badge{}); @@ -68,7 +68,7 @@ UDPC::LockObj UDPC::SharedSpinLock::try_spin_write_lock() { void UDPC::SharedSpinLock::write_unlock(UDPC::Badge &&badge) { if (badge.isValid) { std::lock_guard lock(mutex); - write = false; + write.store(false); badge.isValid = false; } } diff --git a/src/CXX11_shared_spin_lock.hpp b/src/CXX11_shared_spin_lock.hpp index 4fab36a..8b524ed 100644 --- a/src/CXX11_shared_spin_lock.hpp +++ b/src/CXX11_shared_spin_lock.hpp @@ -84,8 +84,8 @@ private: Weak selfWeakPtr; std::mutex mutex; - unsigned int read; - bool write; + std::atomic_uint read; + std::atomic_bool write; };