17#ifndef CYBER_BASE_ATOMIC_RW_LOCK_H_
18#define CYBER_BASE_ATOMIC_RW_LOCK_H_
23#include <condition_variable>
45 explicit AtomicRWLock(
bool write_first) : write_first_(write_first) {}
57 std::atomic<uint32_t> write_lock_wait_num_ = {0};
58 std::atomic<int32_t> lock_num_ = {0};
59 bool write_first_ =
true;
62inline void AtomicRWLock::ReadLock() {
63 uint32_t retry_times = 0;
64 int32_t lock_num = lock_num_.load();
67 while (lock_num <
RW_LOCK_FREE || write_lock_wait_num_.load() > 0) {
70 std::this_thread::yield();
73 lock_num = lock_num_.load();
75 }
while (!lock_num_.compare_exchange_weak(lock_num, lock_num + 1,
76 std::memory_order_acq_rel,
77 std::memory_order_relaxed));
83 std::this_thread::yield();
86 lock_num = lock_num_.load();
88 }
while (!lock_num_.compare_exchange_weak(lock_num, lock_num + 1,
89 std::memory_order_acq_rel,
90 std::memory_order_relaxed));
94inline void AtomicRWLock::WriteLock() {
96 uint32_t retry_times = 0;
97 write_lock_wait_num_.fetch_add(1);
99 std::memory_order_acq_rel,
100 std::memory_order_relaxed)) {
105 std::this_thread::yield();
109 write_lock_wait_num_.fetch_sub(1);
112inline void AtomicRWLock::ReadUnlock() { lock_num_.fetch_sub(1); }
114inline void AtomicRWLock::WriteUnlock() { lock_num_.fetch_add(1); }
static const uint32_t MAX_RETRY_TIMES
static const int32_t RW_LOCK_FREE
AtomicRWLock(bool write_first)
static const int32_t WRITE_EXCLUSIVE