1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
#pragma once
#include <atomic>
namespace Death { namespace Threading {
//###==##====#=====--==~--~=~- --- -- - - - -
/**
@brief Lightweight spinlock implementation
*/
class Spinlock
{
public:
Spinlock() = default;
Spinlock(Spinlock const&) = delete;
Spinlock& operator=(Spinlock const&) = delete;
void lock() noexcept
{
do {
while (_state.load(std::memory_order_relaxed) == State::Locked) {
// Keep trying...
}
} while (_state.exchange(State::Locked, std::memory_order_acquire) == State::Locked);
}
void unlock() noexcept
{
_state.store(State::Free, std::memory_order_release);
}
private:
enum class State : std::uint8_t {
Free = 0,
Locked = 1
};
std::atomic<State> _state{State::Free};
};
}}
|