我想运行相同类型的任务(工作线程),但一次不超过一定数量的任务。当任务完成时,其结果是新任务的输入,然后可以启动该新任务。
有没有什么好的方法可以在 C++11 中使用异步/未来范例来实现这一点?
乍一看,它看起来很简单,您只需使用以下命令生成多个任务:
std::future<T> result = std::async(...);
然后运行result.get()
获取任务的异步结果。
然而,这里的问题是未来的对象必须存储在某种队列中并一一等待。不过,可以一遍又一遍地迭代未来的对象,检查它们是否已准备好,但由于不必要的 CPU 负载,这不是所希望的。
是否有可能以某种方式等待any未来从给定的集合中准备好并获得其结果?
到目前为止,我能想到的唯一选择是没有任何异步/未来的老式方法。具体来说,生成多个工作线程,并在每个线程结束时将其结果推送到互斥锁保护的队列中,通过条件变量通知等待线程该队列已更新为更多结果。
还有其他更好的异步/未来解决方案吗?
C++11 中的线程支持只是第一步,而std::future
太棒了,它还不支持多重等待。
然而,你可以相对低效地伪造它。您最终为每个创建一个辅助线程std::future
(哎呀,非常昂贵),然后收集他们的“这个future
已准备好”进入同步的多生产者单消费者消息队列,然后设置一个消费者任务来调度给定的事实std::future
准备好了。
The std::future
在这个系统中并没有添加太多功能,并且让任务直接声明它们已准备好并将其结果粘贴到上述队列中会更高效。如果您走这条路,您可以编写与以下模式匹配的包装器std::async
or std::thread
,并返回一个std::future
就像代表队列消息的对象。这基本上涉及重新实现并发库的一部分。
如果你想留下来std::future
,你可以创建shared_future
s,并且让每个相关任务依赖于一组shared_future
s:即,无需中央调度程序即可完成。这不允许诸如中止/关闭消息之类的事情,我认为这对于强大的多线程任务系统至关重要。
终于可以等了C++2x http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4107.html,或者每当并发TS被折叠到标准中,为你解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)