1#ifndef LIPH_CONCURRENCY_LOCK_H_
2#define LIPH_CONCURRENCY_LOCK_H_
16 bool try_lock() noexcept {
return !v_.test_and_set(std::memory_order_acquire); }
20 std::this_thread::yield();
24 void unlock() noexcept { v_.clear(std::memory_order_release); }
46 explicit hierarchical_mutex(
unsigned long value) : hierarchy_value_(value), previous_hierarchy_value_(0) {}
48 check_for_hierarchy_violation();
50 update_hierarchy_value();
53 this_thread_hierarchy_value = previous_hierarchy_value_;
57 check_for_hierarchy_violation();
58 if (!mtx_.try_lock())
return false;
59 update_hierarchy_value();
65 unsigned long const hierarchy_value_;
66 unsigned long previous_hierarchy_value_;
67 static thread_local unsigned long this_thread_hierarchy_value;
69 void check_for_hierarchy_violation() {
70 if (this_thread_hierarchy_value <= hierarchy_value_) {
71 throw std::logic_error(
"mutex hierarchy violated");
74 void update_hierarchy_value() {
75 previous_hierarchy_value_ = this_thread_hierarchy_value;
76 this_thread_hierarchy_value = hierarchy_value_;
80inline thread_local unsigned long hierarchical_mutex::this_thread_hierarchy_value(
81 std::numeric_limits<unsigned long>::max());
86 explicit unique_unlock(std::unique_lock<Mutex>& lock) : lock_(lock) { lock_.unlock(); }
95 std::unique_lock<Mutex>& lock_;
void unlock()
Definition: lock.h:52
bool try_lock()
Definition: lock.h:56
void lock()
Definition: lock.h:47
hierarchical_mutex(unsigned long value)
Definition: lock.h:46
~scoped_lock()
Definition: lock.h:40
scoped_lock(spinlock &sp) noexcept
Definition: lock.h:38
void unlock() noexcept
Definition: lock.h:24
void lock() noexcept
Definition: lock.h:18
bool try_lock() noexcept
Definition: lock.h:16
unique_unlock(const unique_unlock &)=delete
~unique_unlock()
Definition: lock.h:87
unique_unlock(std::unique_lock< Mutex > &lock)
Definition: lock.h:86
unique_unlock & operator=(const unique_unlock &)=delete
unique_unlock & operator=(unique_unlock &&)=delete
unique_unlock(unique_unlock &&)=delete
Definition: algorithm.h:10