aboutsummaryrefslogtreecommitdiffstats
path: root/yage/util/syncqueue.h
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-11-14 21:16:30 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-11-14 21:16:30 +0000
commit443ae47fc210bcfe10f6f6c5ac8aa3453e1d29d2 (patch)
tree4c06b7961a4f3e5fe1b67cb3c7d6290edcedc498 /yage/util/syncqueue.h
parente68759a4101567a27e306eae0a907baa759ae80c (diff)
downloadYAGE-443ae47fc210bcfe10f6f6c5ac8aa3453e1d29d2.tar.gz
YAGE-443ae47fc210bcfe10f6f6c5ac8aa3453e1d29d2.zip
Adding syncqueue
Diffstat (limited to 'yage/util/syncqueue.h')
-rw-r--r--yage/util/syncqueue.h81
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