diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2017-11-14 21:16:30 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2017-11-14 21:16:30 +0000 |
commit | 443ae47fc210bcfe10f6f6c5ac8aa3453e1d29d2 (patch) | |
tree | 4c06b7961a4f3e5fe1b67cb3c7d6290edcedc498 /yage/util/syncqueue.h | |
parent | e68759a4101567a27e306eae0a907baa759ae80c (diff) | |
download | YAGE-443ae47fc210bcfe10f6f6c5ac8aa3453e1d29d2.tar.gz YAGE-443ae47fc210bcfe10f6f6c5ac8aa3453e1d29d2.zip |
Adding syncqueue
Diffstat (limited to 'yage/util/syncqueue.h')
-rw-r--r-- | yage/util/syncqueue.h | 81 |
1 files changed, 81 insertions, 0 deletions
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 <condition_variable> +#include <mutex> +#include <queue> + +namespace yage +{ + +template <typename T> +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<T> queue_; + std::mutex mutex_; + std::condition_variable cond_; +}; + +// Template definitions + +template <typename T> +T SyncQueue<T>::pop() +{ + std::unique_lock<std::mutex> mlock(mutex_); + + while (queue_.empty()) { + cond_.wait(mlock); + } + + auto item = queue_.front(); + queue_.pop(); + return item; +} + +template <typename T> +void SyncQueue<T>::pop(T &item) +{ + std::unique_lock<std::mutex> mlock(mutex_); + + while (queue_.empty()) { + cond_.wait(mlock); + } + + item = queue_.front(); + queue_.pop(); +} + +template <typename T> +void SyncQueue<T>::push(const T &item) +{ + std::unique_lock<std::mutex> mlock(mutex_); + + queue_.push(item); + mlock.unlock(); + cond_.notify_one(); +} + +template <typename T> +void SyncQueue<T>::push(T &&item) +{ + std::unique_lock<std::mutex> mlock(mutex_); + + queue_.push(std::move(item)); + mlock.unlock(); + cond_.notify_one(); +} + +} // namespace yage + +#endif |