我想运行相同类型的任务(工作线程),但一次不超过一定数量的任务。当一个任务完成时,它的结果是一个新任务的输入,然后可以启动它。
有没有什么好的方法可以在 C++11 中使用异步/未来范式来实现这一点?
乍一看,它看起来很简单,您只需生成多个任务:
std::future<T> result = std::async(...);
然后,运行result.get()
以获取任务的异步结果。
然而,这里的问题是,未来的对象必须存储在某种队列中,并一个一个地等待。但是,可以一遍又一遍地迭代未来的对象,检查它们中的任何一个是否准备好,但由于不必要的 CPU 负载,这是不希望的。
是否有可能以某种方式等待给定集合中的任何未来准备好并获得结果?
到目前为止,我能想到的唯一选择是没有任何异步/未来的老式方法。具体来说,生成多个工作线程并在每个线程结束时将其结果推送到受互斥体保护的队列中,通过条件变量通知等待线程队列已更新为更多结果。
还有其他更好的异步/未来解决方案吗?