#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}; };