10 #ifndef CTRL_UTILS_ATOMIC_QUEUE_H_
11 #define CTRL_UTILS_ATOMIC_QUEUE_H_
14 #include <condition_variable>
41 std::unique_lock<std::mutex> lock(m_);
42 cv_.wait(lock, [
this]() {
return !queue_.empty() || terminate_; });
43 if (terminate_)
return;
45 std::swap(value, queue_.front());
54 std::unique_lock<std::mutex> lock(m_);
65 std::unique_lock<std::mutex> lock(m_);
66 queue_.push(std::move(item));
74 template <
class...
Args>
77 std::unique_lock<std::mutex> lock(m_);
78 queue_.emplace(args...);
96 std::condition_variable cv_;
97 std::sig_atomic_t terminate_ =
false;
103 template <
typename T>
123 std::unique_lock<std::mutex> lock(m_);
124 cv_.wait(lock, [
this]() {
return num_unread_ > 0 || terminate_; });
125 if (terminate_)
return;
127 std::swap(value, queue_[idx_read_]);
128 IncrementLoop(idx_read_);
137 std::unique_lock<std::mutex> lock(m_);
138 queue_[idx_write_] = item;
149 std::unique_lock<std::mutex> lock(m_);
150 std::swap(queue_[idx_write_], item);
159 template <
class...
Args>
162 std::unique_lock<std::mutex> lock(m_);
163 queue_[idx_write_] = T(args...);
180 void IncrementLoop(
size_t& idx) {
181 if (++idx >= queue_.size()) idx = 0;
183 void IncrementWrite() {
184 if (num_unread_ >= queue_.size()) {
185 IncrementLoop(idx_read_);
189 IncrementLoop(idx_write_);
191 std::vector<T> queue_;
193 std::condition_variable cv_;
194 std::sig_atomic_t terminate_ =
false;
196 size_t num_unread_ = 0;
197 size_t idx_write_ = 0;
198 size_t idx_read_ = 0;
Definition: argparse.h:83
Definition: atomic_queue.h:104
T Pop()
Definition: atomic_queue.h:113
void Push(const T &item)
Definition: atomic_queue.h:135
void Push(T &&item)
Definition: atomic_queue.h:147
void Emplace(Args &&... args)
Definition: atomic_queue.h:160
void Pop(T &value)
Definition: atomic_queue.h:122
void Terminate()
Definition: atomic_queue.h:174
Definition: atomic_queue.h:24
void Pop(T &value)
Definition: atomic_queue.h:40
T Pop()
Definition: atomic_queue.h:31
void Emplace(Args &&... args)
Definition: atomic_queue.h:75
void Push(const T &item)
Definition: atomic_queue.h:52
void Push(T &&item)
Definition: atomic_queue.h:63
void Terminate()
Definition: atomic_queue.h:88
Definition: ctrl_utils.cc:18