diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-29 23:59:50 +0100 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-29 23:59:50 +0100 |
| commit | 73f978f1e1e42ec2b7445dd77ec35a58ff08cf20 (patch) | |
| tree | ecbaa33787212180156e84813473c16b6977b329 /src/utils | |
| parent | 5edbc081d61d47e5938a76fcb201aed4b148f1b4 (diff) | |
| parent | 1664027209ea3b8eb327b7755e4111577e66a2ee (diff) | |
merge and use 16 threadsradxa_imx287
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}; +}; |
