made BlockingQueue stable

This commit is contained in:
Neeflix
2018-05-31 20:42:22 +02:00
parent 010415c4ae
commit 89a6e04dfa

View File

@@ -10,8 +10,9 @@
#include <mutex> #include <mutex>
#include <condition_variable> #include <condition_variable>
#include <deque> #include <boost/heap/priority_queue.hpp>
#include <queue>
using namespace boost;
template <typename T> template <typename T>
class BlockingQueue class BlockingQueue
@@ -19,21 +20,22 @@ class BlockingQueue
private: private:
std::mutex d_mutex; std::mutex d_mutex;
std::condition_variable d_condition; std::condition_variable d_condition;
std::priority_queue<T> d_queue; heap::priority_queue<T, heap::stable<T>> p_queue;
public: public:
void push(T const& value) { void push(T const& value) {
{ {
std::unique_lock<std::mutex> lock(this->d_mutex); std::unique_lock<std::mutex> lock(this->d_mutex);
d_queue.push_front(value); p_queue.push_front(value);
} }
this->d_condition.notify_one(); this->d_condition.notify_one();
} }
T pop() { T pop() {
std::unique_lock<std::mutex> lock(this->d_mutex); std::unique_lock<std::mutex> lock(this->d_mutex);
this->d_condition.wait(lock, [=]{ return !this->d_queue.empty(); }); this->d_condition.wait(lock, [=]{ return !this->p_queue.empty(); });
T rc(std::move(this->d_queue.back())); T rc(std::move(this->p_queue.back()));
this->d_queue.pop_back(); this->p_queue.pop_back();
return rc; return rc;
} }
}; };