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;
62 inline 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));
94 inline 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);
112 inline void AtomicRWLock::ReadUnlock() { lock_num_.fetch_sub(1); }
114 inline void AtomicRWLock::WriteUnlock() { lock_num_.fetch_add(1); }
120 #endif // CYBER_BASE_ATOMIC_RW_LOCK_H_
static const int32_t WRITE_EXCLUSIVE
Definition: atomic_rw_lock.h:42
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
Definition: rw_lock_guard.h:48
Definition: atomic_rw_lock.h:36
Definition: rw_lock_guard.h:35
AtomicRWLock()
Definition: atomic_rw_lock.h:44
AtomicRWLock(bool write_first)
Definition: atomic_rw_lock.h:45
static const uint32_t MAX_RETRY_TIMES
Definition: atomic_rw_lock.h:43
static const int32_t RW_LOCK_FREE
Definition: atomic_rw_lock.h:41