我有一个生产者线程和几个消费者,每个消费者都有:自己的数据队列和唯一 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/