Got asked this in an interview recently and it stumped me. A better name might be ticket lock.
class fair_spinlock
{
std::atomic<uint32_t> _ticket{};
std::atomic<uint32_t> _counter{};
public:
fair_spinlock() = default;
~fair_spinlock() = default;
fair_spinlock(fair_spinlock&) = delete;
fair_spinlock& operator=(fair_spinlock&) = delete;
fair_spinlock(fair_spinlock&&) = delete;
fair_spinlock& operator=(fair_spinlock&&) = delete;
void lock()
{
auto ticket = _ticket.fetch_add(1, std::memory_order_relaxed);
while(_counter.load() != ticket)
{
_mm_pause();
}
}
void unlock()
{
++_counter;
}
};