diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-29 18:49:35 +0100 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-29 18:49:35 +0100 |
| commit | c657073f8ebe84505613b593db4a41f30f86c970 (patch) | |
| tree | 2774796d44ae38852fbbea9af0cdb82899c806d0 /src/utils | |
| parent | fe1a89dbd83e10bfb480962a511fa0f43885eb77 (diff) | |
introduce sem_queue
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}; +}; |
