等待多个期货?

alv*_*eko 44 c++ multithreading c++11

我想运行相同类型的任务(工作线程),但一次只能执行一定数量的任务.当任务完成时,其结果是新任务的输入,然后可以启动该任务.

有没有什么好的方法可以在C++ 11中使用异步/未来范例来实现它?

乍一看,它看起来很直接,您只需生成多个任务:

std::future<T> result = std::async(...);
Run Code Online (Sandbox Code Playgroud)

然后,运行result.get()以获取任务的异步结果.

然而,这里的问题是未来的对象必须存储在某种队列中并且一个接一个地等待.但是,可以一遍又一遍地迭代未来的对象,检查它们是否已准备好,但由于不必要的CPU负载,这是不可取的.

有可能以某种方式等待来自给定集合的任何未来准备好并获得其结果吗?

到目前为止,我能想到的唯一选择是没有任何异步/未来的老派方法.具体来说,产生多个工作线程并在每个线程的末尾将其结果推送到受互斥锁保护的队列中,该队列通过条件变量通知等待线程,该条件变量已更新队列以获得更多结果.

有没有其他更好的解决方案与异步/未来可能?

Yak*_*ont 18

C++ 11中的线程支持只是第一次传递,虽然std::future岩石,它还不支持多次等待.

但是,你可以相对低效地伪造它.你最终创造了每一个辅助线程std::future(哎哟,非常昂贵),然后收集他们"这future是准备"成同步许多生产者单消费者的消息队列,然后设置调度该事实给消费者的任务std::future是准备.

std::future本系统中不会增加太多的功能,并直接指出,他们准备和坚持他们的结果为上述队列会比较有效率的任务.如果你走这条路,你可以编写与std::asyncor 的模式匹配的包装器std::thread,并返回一个std::future代表队列消息的like对象.这基本上涉及重新实现并发库的一大块.

如果你想继续使用std::future,你可以创建shared_futures,并让每个依赖任务依赖于shared_futures 的集合:即,没有中央调度程序.这不允许中止/关闭消息,我认为这对于强大的多线程任务系统至关重要.

最后,您可以等待C++ 2x,或者将并发TS折叠到标准中,以便为您解决问题.

  • 似乎也不在 C++20 中。 (4认同)
  • @Steephen对不起:它不是在C++ 14中,我是非常乐观的.链接到我认为可以解决问题的纸张.它不仅具有`when_any`和`when_all`,还可以将`.then`s附加到一堆`futuref',并在其中发出一个条件变量,你等待它:很像"老派"在OP中的方法,但内容的制作者不需要了解队列机制,他们只需要提供一个带有.then`的未来.模拟`.then`只能用(最多)每个'future`的额外开销线程完成,这远非理想. (2认同)
  • 期货的扩展在2015年初进入[Concurrency TS](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4399.html)的时候,完成。 (2认同)

Seb*_*ach 6

您可以创建“ 第1代 ”的所有期货,并将所有这些期货分配给第2代任务,然后他们将自己等待输入。