summaryrefslogtreecommitdiffstats
path: root/thdq.hpp
diff options
context:
space:
mode:
authorfireice-uk <fireice2@o2.pl>2017-01-02 12:51:13 +0000
committerfireice-uk <fireice2@o2.pl>2017-01-02 12:51:13 +0000
commit6368ab745532d273775875f16a6053fb79586bc1 (patch)
treeeb472eebbbfc700662e150c7dfe17338678de794 /thdq.hpp
parent1384d2654117a4e9f5d2e34e74a872f1d551e22b (diff)
downloadxmr-stak-6368ab745532d273775875f16a6053fb79586bc1.zip
xmr-stak-6368ab745532d273775875f16a6053fb79586bc1.tar.gz
First!
Diffstat (limited to 'thdq.hpp')
-rw-r--r--thdq.hpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/thdq.hpp b/thdq.hpp
new file mode 100644
index 0000000..248c807
--- /dev/null
+++ b/thdq.hpp
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <queue>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+
+template <typename T>
+class thdq
+{
+public:
+ T pop()
+ {
+ std::unique_lock<std::mutex> mlock(mutex_);
+ while (queue_.empty()) { cond_.wait(mlock); }
+ auto item = std::move(queue_.front());
+ queue_.pop();
+ return item;
+ }
+
+ void pop(T& item)
+ {
+ std::unique_lock<std::mutex> mlock(mutex_);
+ while (queue_.empty()) { cond_.wait(mlock); }
+ item = queue_.front();
+ queue_.pop();
+ }
+
+ void push(const T& item)
+ {
+ std::unique_lock<std::mutex> mlock(mutex_);
+ queue_.push(item);
+ mlock.unlock();
+ cond_.notify_one();
+ }
+
+ void push(T&& item)
+ {
+ std::unique_lock<std::mutex> mlock(mutex_);
+ queue_.push(std::move(item));
+ mlock.unlock();
+ cond_.notify_one();
+ }
+
+private:
+ std::queue<T> queue_;
+ std::mutex mutex_;
+ std::condition_variable cond_;
+};
OpenPOWER on IntegriCloud