From 443ae47fc210bcfe10f6f6c5ac8aa3453e1d29d2 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Tue, 14 Nov 2017 21:16:30 +0000 Subject: Adding syncqueue --- yage/util/syncqueue.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 yage/util/syncqueue.h (limited to 'yage/util/syncqueue.h') diff --git a/yage/util/syncqueue.h b/yage/util/syncqueue.h new file mode 100644 index 00000000..a23b1857 --- /dev/null +++ b/yage/util/syncqueue.h @@ -0,0 +1,81 @@ +#ifndef YAGE_UTIL_SYNCQUEUE_H +#define YAGE_UTIL_SYNCQUEUE_H + +#include +#include +#include + +namespace yage +{ + +template +class SyncQueue +{ +public: + SyncQueue() = default; + SyncQueue(const SyncQueue &) = delete; + SyncQueue &operator=(const SyncQueue &) = delete; + + T pop(); + void pop(T &item); + void push(const T &item); + void push(T &&item); + +private: + std::queue queue_; + std::mutex mutex_; + std::condition_variable cond_; +}; + +// Template definitions + +template +T SyncQueue::pop() +{ + std::unique_lock mlock(mutex_); + + while (queue_.empty()) { + cond_.wait(mlock); + } + + auto item = queue_.front(); + queue_.pop(); + return item; +} + +template +void SyncQueue::pop(T &item) +{ + std::unique_lock mlock(mutex_); + + while (queue_.empty()) { + cond_.wait(mlock); + } + + item = queue_.front(); + queue_.pop(); +} + +template +void SyncQueue::push(const T &item) +{ + std::unique_lock mlock(mutex_); + + queue_.push(item); + mlock.unlock(); + cond_.notify_one(); +} + +template +void SyncQueue::push(T &&item) +{ + std::unique_lock mlock(mutex_); + + queue_.push(std::move(item)); + mlock.unlock(); + cond_.notify_one(); +} + +} // namespace yage + +#endif -- cgit