[util] Add ticket lock implementation

This commit is contained in:
Philip Rebohle 2018-11-13 17:05:06 +01:00
parent 1724d51079
commit 63d42073b8
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
1 changed files with 39 additions and 0 deletions

View File

@ -0,0 +1,39 @@
#pragma once
#include <atomic>
#include "../thread.h"
namespace dxvk::sync {
/**
* \brief Ticket spinlock
*
* A fair spinlock implementation that should
* be preferred over \ref Spinlock when one of
* the threads accessing the lock is likely to
* starve another.
*/
class TicketLock {
public:
void lock() {
uint32_t ticket = m_counter.fetch_add(1);
while (m_serving.load(std::memory_order_acquire) != ticket)
continue;
}
void unlock() {
m_serving.fetch_add(1, std::memory_order_release);
}
private:
std::atomic<uint32_t> m_counter = { 0 };
std::atomic<uint32_t> m_serving = { 0 };
};
}