BRICKS
Small, useful blocks of code, to build bigger things.
Loading...
Searching...
No Matches
mutex.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <mutex>
4#include <type_traits>
5
7
8namespace bricks {
9
21template <typename Class, typename std::enable_if_t<std::is_class_v<Class>, bool> = true>
22class mutex : private Class {
23 private:
24 friend class detail::write_guard<mutex, std::mutex>;
25 friend class detail::write_guard<const mutex, std::mutex>;
26
27 public:
28 using value_type = Class;
29
30 using lock_guard = detail::write_guard<mutex, std::mutex>;
31 using const_lock_guard = detail::write_guard<const mutex, std::mutex>;
32
33 using Class::Class;
34
41 auto lock() noexcept -> lock_guard { return lock_guard{*this, mutex_}; }
42 auto lock() const noexcept -> const_lock_guard { return const_lock_guard{*this, mutex_}; }
43
44 private:
45 mutable std::mutex mutex_;
46};
47
48} // namespace bricks
A mutual exclusion primitive that can be used to protect shared data.
Definition mutex.hpp:22
auto lock() noexcept -> lock_guard
Locks the mutex, blocking until the lock is acquired.
Definition mutex.hpp:41
auto lock() const noexcept -> const_lock_guard
Definition mutex.hpp:42
Class value_type
Definition mutex.hpp:28
detail::write_guard< mutex, std::mutex > lock_guard
Definition mutex.hpp:30
detail::write_guard< const mutex, std::mutex > const_lock_guard
Definition mutex.hpp:31
Definition algorithm.hpp:12