From c657073f8ebe84505613b593db4a41f30f86c970 Mon Sep 17 00:00:00 2001 From: Nikita Kostovsky Date: Sat, 29 Nov 2025 18:49:35 +0100 Subject: introduce sem_queue --- src/utils/sem_queue.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/utils/sem_queue.h (limited to 'src/utils/sem_queue.h') diff --git a/src/utils/sem_queue.h b/src/utils/sem_queue.h new file mode 100644 index 0000000..6987d88 --- /dev/null +++ b/src/utils/sem_queue.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include + +template +class sem_queue +{ +public: + inline void enqueue(const T &value) + { + m_free.acquire(); + std::lock_guard l{m_mtx}; + m_queue.push(value); + m_used.release(); + } + + inline T dequeue() + { + m_used.acquire(); + std::lock_guard l{m_mtx}; + const auto result = m_queue.front(); + m_queue.pop(); + m_free.release(); + + return result; + } + +private: + std::queue m_queue; + std::mutex m_mtx; + std::counting_semaphore m_free{S}; + std::counting_semaphore m_used{0}; +}; -- cgit v1.2.3-70-g09d2