C 等价于 Java 的 BlockingQueue

新手上路,请多包涵

我正在将一些 Java 代码移植到 C++ 中,其中一个特定部分使用 BlockingQueue 将消息从许多生产者传递给单个消费者。

如果您不熟悉 Java BlockingQueue 是什么,它只是一个具有硬容量的队列,它向队列中的 put() 和 take() 公开线程安全方法。如果队列已满,put() 阻塞,如果队列为空,则 take() 阻塞。此外,还提供了这些方法的超时敏感版本。

超时与我的用例相关,因此提供这些的建议是理想的。如果没有,我可以自己编写一些代码。

我用谷歌搜索并快速浏览了 Boost 库,但没有找到类似的东西。也许我在这里是盲人……但有人知道一个好的推荐吗?

谢谢!

原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 482
1 个回答

它不是固定大小,也不支持超时,但这是我最近使用 C++ 2011 构造发布的队列的简单实现:

 #include <mutex>
#include <condition_variable>
#include <deque>

template <typename T>
class queue
{
private:
    std::mutex              d_mutex;
    std::condition_variable d_condition;
    std::deque<T>           d_queue;
public:
    void push(T const& value) {
        {
            std::unique_lock<std::mutex> lock(this->d_mutex);
            d_queue.push_front(value);
        }
        this->d_condition.notify_one();
    }
    T pop() {
        std::unique_lock<std::mutex> lock(this->d_mutex);
        this->d_condition.wait(lock, [=]{ return !this->d_queue.empty(); });
        T rc(std::move(this->d_queue.back()));
        this->d_queue.pop_back();
        return rc;
    }
};

扩展和使用定时等待弹出应该是微不足道的。我没有这样做的主要原因是我对到目前为止所想到的界面选择不满意。

原文由 Dietmar Kühl 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题