12#include <condition_variable>
28class ThreadSafeQueue {
30 ThreadSafeQueue() =
default;
31 virtual ~ThreadSafeQueue();
33 ThreadSafeQueue(
const ThreadSafeQueue&) =
delete;
34 ThreadSafeQueue& operator=(
const ThreadSafeQueue&) =
delete;
41 void Put(std::unique_ptr<T>& value);
52 [[nodiscard]]
bool Get(std::unique_ptr<T>& dest,
bool block);
60 [[nodiscard]]
bool Empty()
const;
66 [[nodiscard]]
size_t Size()
const;
73 mutable std::mutex lock_;
74 std::queue<std::unique_ptr<T>> queue_;
75 std::atomic<bool> stop_ =
77 std::condition_variable
82ThreadSafeQueue<T>::~ThreadSafeQueue() {
84 queue_event_.notify_one();
85 std::lock_guard lock(lock_);
86 while (!queue_.empty()) {
96 std::lock_guard lock(lock_);
97 queue_.push(std::move(value));
98 queue_event_.notify_one();
108 std::unique_lock lock(lock_);
109 queue_event_.wait(lock, [&] {
return !queue_.empty() || stop_.load(); });
110 if (queue_.empty() || stop_) {
113 dest = std::move(queue_.front());
116 std::lock_guard lock(lock_);
117 if (queue_.empty() || stop_) {
120 dest = std::move(queue_.front());
128 std::lock_guard lock(lock_);
129 return queue_.empty();
134 std::lock_guard lock(lock_);
135 return queue_.size();
139 std::unique_ptr<T> temp;
140 while (
Get(temp,
false)) {
149 queue_event_.notify_one();
155 queue_event_.notify_one();
void Clear()
Clears the queue.
Definition threadsafequeue.h:138
void Start()
Restarts the queue.
Definition threadsafequeue.h:146
bool Get(std::unique_ptr< T > &dest, bool block)
Fetch the first object from the queue.
Definition threadsafequeue.h:102
void Stop()
Stops all blocking Get() calls.
Definition threadsafequeue.h:153
size_t Size() const
Returns number of items in the queue.
Definition threadsafequeue.h:133
bool Empty() const
Returns true if the queue is empty.
Definition threadsafequeue.h:127
void Put(std::unique_ptr< T > &value)
Adds a value at the end of the queue.
Definition threadsafequeue.h:92
The log namespace is used for log related classes and functions.
Definition idirectory.h:18