我想运行同一类型的任务(工作线程),但同时不超过一定数量的任务。当一个任务完成时,它的结果将成为一个新任务的输入,然后可以启动新任务。
有没有好的方法在C++11中用async/future范例实现这个需求?
乍一看,这似乎很简单,你只需要使用以下代码来生成多个任务:
std::future<T> result = std::async(...);
然后,运行 result.get()
以获取任务的异步结果。
然而,问题在于future对象必须存储在某种队列中,并逐个等待。虽然可以一遍又一遍地迭代未来的对象,检查它们是否准备好,但由于不必要的CPU负载,这并不是所期望的。
是否有可能以某种方式等待给定集合中任何一个未来就绪并获取其结果?
到目前为止,我唯一想到的选择是一种没有任何异步/future的老派方法。具体来说,生成多个工作线程,在每个线程结束时将其结果推入互斥保护的队列中,并通过条件变量通知等待线程,队列已更新了更多的结果。
是否存在其他使用异步/future的更好解决方案?
when_any(futures...).then(foo)
,但目前来说,你有点运气不好。 - Xeowhen_any
的信息在此处:http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3558.pdf。Boost的wait_for_any正是我需要的。据我所知,它与不支持注册外部等待者(cvs)的std::future不兼容,对吧? - alvekowhen_any
/.then(...)
没有被纳入 C++14 中。我认为它们将会出现在在芝加哥启动的并发 TS 中。 - je4d