diff options
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/sem_queue.cpp | 1 | ||||
| -rw-r--r-- | src/utils/sem_queue.h | 35 |
2 files changed, 36 insertions, 0 deletions
diff --git a/src/utils/sem_queue.cpp b/src/utils/sem_queue.cpp new file mode 100644 index 0000000..a3ca6e6 --- /dev/null +++ b/src/utils/sem_queue.cpp @@ -0,0 +1 @@ +#include "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 <mutex> +#include <queue> +#include <semaphore> + +template<typename T, size_t S> +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<T> m_queue; + std::mutex m_mtx; + std::counting_semaphore<S> m_free{S}; + std::counting_semaphore<S> m_used{0}; +}; |
