diff options
author | fireice-uk <fireice2@o2.pl> | 2017-01-02 12:51:13 +0000 |
---|---|---|
committer | fireice-uk <fireice2@o2.pl> | 2017-01-02 12:51:13 +0000 |
commit | 6368ab745532d273775875f16a6053fb79586bc1 (patch) | |
tree | eb472eebbbfc700662e150c7dfe17338678de794 /thdq.hpp | |
parent | 1384d2654117a4e9f5d2e34e74a872f1d551e22b (diff) | |
download | xmr-stak-6368ab745532d273775875f16a6053fb79586bc1.zip xmr-stak-6368ab745532d273775875f16a6053fb79586bc1.tar.gz |
First!
Diffstat (limited to 'thdq.hpp')
-rw-r--r-- | thdq.hpp | 49 |
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_;
+}; |