【发布时间】:2023-03-23 02:55:01
【问题描述】:
我有一个生产者线程和几个消费者,每个消费者都有:拥有数据和唯一 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 是对队列的引用。 但是我怎样才能用更好的方式同步呢? 提前致谢。 附:队列总会有数据,最后一个数据必须说'exit'。
【问题讨论】:
-
缺少复制/分配并不意味着您不能将东西放入容器中。只有部分操作不可用。您仍然可以使用
emplace和at。 -
请看this。
-
“但我有几个消费者,所以我需要几个 std::condition_variable” 不正确。
-
那么如何识别需要唤醒的线程呢?
-
@user3365834 你在这里真的需要一个线程池。不要试图重新发明轮子。
标签: c++ multithreading c++11