C ++ 11中的并发阻塞队列

时间:2013-07-25 09:18:59

标签: c++11 concurrency

对于在线程之间传递消息,我正在寻找具有以下属性的并发队列:

  • 有界大小
  • 阻止/等待元素可用的pop方法。
  • 取消等待的中止方法
  • 可选:优先级

多个生产者,一个消费者。

TBB的concurrent_bounded_queue会提供这一点,但我正在寻找替代方案来避免TBB的额外依赖。

该应用程序使用C ++ 11和boost。我在找不到任何合适的东西。有什么选择?

1 个答案:

答案 0 :(得分:6)

使用Boost库(circular_buffer)和C ++ 11标准库实现Naive。

#include <mutex>
#include <condition_variable>
#include <boost/circular_buffer.hpp>

struct operation_aborted {};

template <class T, std::size_t N>
class bound_queue {
public:
  typedef T value_type;
  bound_queue() : q_(N), aborted_(false) {}
  void push(value_type data)
  {
    std::unique_lock<std::mutex> lk(mtx_);
    cv_pop_.wait(lk, [=]{ return !q_.full() || aborted_; });
    if (aborted_) throw operation_aborted();
    q_.push_back(data);
    cv_push_.notify_one();
  }
  value_type pop()
  {
    std::unique_lock<std::mutex> lk(mtx_);
    cv_push_.wait(lk, [=]{ return !q_.empty() || aborted_; });
    if (aborted_) throw operation_aborted();
    value_type result = q_.front();
    q_.pop_front();
    cv_pop_.notify_one();
    return result;
  }
  void abort()
  {
    std::lock_guard<std::mutex> lk(mtx_);
    aborted_ = true;
    cv_pop_.notify_all();
    cv_push_.notify_all(); 
  }
private:
  boost::circular_buffer<value_type> q_;
  bool aborted_;
  std::mutex mtx_;
  std::condition_variable cv_push_;
  std::condition_variable cv_pop_;
};