optimize lock_shared

This commit is contained in:
mutouyun 2018-12-14 11:21:46 +08:00
parent 238f769f7a
commit 7b812c3c6e

View File

@ -36,15 +36,18 @@ public:
} }
void lock_shared() { void lock_shared() {
for (unsigned k = 0;; ++k) {
auto old = lc_.load(std::memory_order_relaxed); auto old = lc_.load(std::memory_order_relaxed);
// if w_flag set, just continue; otherwise cas lc + 1 (set r-lock) for (unsigned k = 0;; ++k) {
if (!(old & w_flag) && // if w_flag set, just continue
lc_.compare_exchange_weak(old, old + 1, std::memory_order_acquire)) { if (old & w_flag) {
yield(k);
old = lc_.load(std::memory_order_acquire);
}
// otherwise try cas lc + 1 (set r-lock)
else if (lc_.compare_exchange_weak(old, old + 1, std::memory_order_acquire)) {
break; break;
} }
yield(k); // set r-lock failed, old has been updated
std::atomic_thread_fence(std::memory_order_acquire);
} }
} }