首页 文章

等待多个期货?

提问于
浏览
36

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

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

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

std::future<T> result = std::async(...);

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

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

是否有可能以某种方式等待来自给定集合的 any 未来准备并获得其结果?

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

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

2 回答

  • 17

    C 11中的线程支持只是第一次传递,而 std::future 摇滚,它不支持多次等待 .

    但是,你可以相对低效地伪造它 . 你最终为每个 std::future (哎哟,非常昂贵)创建一个帮助程序线程,然后将他们的“这个 future 准备好”收集到一个同步的多 生产环境 者单一消费者消息队列中,然后设置一个消费者任务,调度一个事实给 std::future 准备好了 .

    此系统中的 std::future 不会添加太多功能,并且具有直接表明它们已准备就绪并将结果粘贴到上述队列中的任务将更有效 . 如果你走这条路线,你可以编写与 std::asyncstd::thread 模式匹配的包装器,并返回一个代表队列消息的 std::future 对象 . 这基本上涉及重新实现并发库的一大块 .

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

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

  • 5

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

相关问题