From b195dfbe09956f25cccfdb712a6350abd10ef7fb Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Tue, 23 Jun 2015 00:08:42 -0700 Subject: [PATCH] Add ConcurrentQueue implementation. Change-Id: I28224d07c0b093bd520f0a1038cc808b1fac626c --- src/support/ConcurrentQueue.h | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/support/ConcurrentQueue.h diff --git a/src/support/ConcurrentQueue.h b/src/support/ConcurrentQueue.h new file mode 100644 index 0000000000..8b83774ab7 --- /dev/null +++ b/src/support/ConcurrentQueue.h @@ -0,0 +1,68 @@ +// +// Copyright (c) 2013 Juan Palacios juan.palacios.puyana@gmail.com +// Subject to the BSD 2-Clause License +// - see < http://opensource.org/licenses/BSD-2-Clause> +// + +#ifndef CONCURRENT_QUEUE_ +#define CONCURRENT_QUEUE_ + +#include +#include +#include +#include + +template +class ConcurrentQueue +{ +public: + T pop() + { + std::unique_lock 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 mlock(mutex_); + while (queue_.empty()) + { + cond_.wait(mlock); + } + item = queue_.front(); + queue_.pop(); + } + + void push(const T& item) + { + std::unique_lock mlock(mutex_); + queue_.push(item); + mlock.unlock(); + cond_.notify_one(); + } + + void push(T&& item) + { + std::unique_lock mlock(mutex_); + queue_.push(std::move(item)); + mlock.unlock(); + cond_.notify_one(); + } + + ConcurrentQueue() = default; + ConcurrentQueue(const ConcurrentQueue&) = delete; + ConcurrentQueue& operator=(const ConcurrentQueue&) = delete; + +private: + std::queue queue_; + std::mutex mutex_; + std::condition_variable cond_; +}; + +#endif