c++ - 一个生产者线程,多个消费者

标签 c++ multithreading c++11

我有一个生产者线程和几个消费者,每个消费者都有:自己的数据队列和唯一 ID。 我使用 std::map 来识别线程的每个队列。

typedef std::map<int, std::queue<Task>> TaskMap;
TaskMap inputQueue;
TaskMap outputQueue;

每个消费者线程在他的队列中处理数据,如果队列为空,线程必须等待数据。 如果我只想用一个线程来完成它,我可以将 std::condition_variable 与 std::unique_lock 一起使用,但我有几个消费者所以我需要几个 std::condition_variable,但我不能将它们保存在容器中(复制/赋值是删除)。 所以我使用这样的代码

while(q.empty()) {
    std::cout << "waiting...\n";
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

其中 q 是对队列的引用。 但是我怎样才能用更好的方式同步它呢? 提前致谢。 附言队列将始终有数据,最后的数据必须说“退出”。

最佳答案

因为每个消费者都有自己的队列,所有消费者只有一个生产者,所以它本质上是一个生产者一个消费者的场景。

换句话说,您没有在所有消费者之间共享一个队列。

关于c++ - 一个生产者线程,多个消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32606446/

相关文章:

visual-studio - 如何在 Visual Studio 中调试线程池?

multithreading - 哪种线程实践在 90% 的时间里都是好的?

c++ - 推断 CRTP 中模板化成员函数的返回类型

c++ - unique_ptr、nullptr 并支持 gcc 4.5.x 和 4.6.x

c++ - 如何只将部分 OpenGL 代码实现到使用 SDL 编写的游戏中?

c++ - 为每个循环将迭代器分配给 std::vector 的当前元素

c++ - 在循环中从 unordered_set 中删除元素时崩溃

c++ - Lambda函数引用指针销毁检测

c++ - 使函数线程安全与否?

c++ - 将 std::atomic 与对齐的类一起使用