EchoMap 2026-07-25 6d3977c
An experimental cross-platform digital signal processing application for sound-source localisation.
Loading...
Searching...
No Matches
ThreadSafeQueue.hpp
Go to the documentation of this file.
1
7
8#ifndef ECHOMAP_THREADSAFEQUEUE_HPP
9#define ECHOMAP_THREADSAFEQUEUE_HPP
10
11#include <condition_variable>
12#include <deque>
13#include <mutex>
14#include <optional>
15
16namespace echomap
17{
18
27template <class ValueT>
28 requires std::move_constructible<ValueT>
30{
31public:
37 void produce(
38 ValueT value
39 )
40 {
41 std::scoped_lock lock(mutex);
42 queue.push_back(std::move(value));
43 cv.notify_one();
44 }
45
54 {
55 std::scoped_lock lock(mutex);
56
57 if (!queue.empty()) {
58 auto value = std::move(queue.front());
59 queue.pop_front();
60 return value;
61 }
62
63 return std::nullopt;
64 }
65
76 std::stop_token stop_token
77 )
78 {
79 std::unique_lock lock(mutex);
80 cv.wait(lock, stop_token, [this] {
81 return !queue.empty();
82 });
83
84 if (queue.empty())
85 return std::nullopt;
86
87 auto value = std::move(queue.front());
88 queue.pop_front();
89 return value;
90 }
91
97 [[nodiscard]] bool empty() const
98 {
99 std::scoped_lock lock(mutex);
100 return queue.empty();
101 }
102
106 void clear()
107 {
108 std::scoped_lock lock(mutex);
109 queue.clear();
110 }
111
112private:
113 mutable std::mutex mutex;
115 std::deque<ValueT> queue;
116};
117
118} // namespace echomap
119
120#endif // ECHOMAP_THREADSAFEQUEUE_HPP
Provides a straightforward thread-safe double-ended queue implementation.
void produce(ValueT value)
Enqueue a value.
void clear()
Empties the queue.
std::optional< ValueT > wait_consume(std::stop_token stop_token)
Attempt to dequeue a value.
std::optional< ValueT > try_consume()
Attempt to dequeue a value.
bool empty() const
Checks the state of the queue.
The main EchoMap outermost namespace for all non-exported symbols.