我想运行相同类型的任务(工作线程),但一次只能执行一定数量的任务.当任务完成时,其结果是新任务的输入,然后可以启动该任务.
有没有什么好的方法可以在C++ 11中使用异步/未来范例来实现它?
乍一看,它看起来很直接,您只需生成多个任务:
std::future<T> result = std::async(...);
Run Code Online (Sandbox Code Playgroud)
然后,运行result.get()以获取任务的异步结果.
然而,这里的问题是未来的对象必须存储在某种队列中并且一个接一个地等待.但是,可以一遍又一遍地迭代未来的对象,检查它们是否已准备好,但由于不必要的CPU负载,这是不可取的.
有可能以某种方式等待来自给定集合的任何未来准备好并获得其结果吗?
到目前为止,我能想到的唯一选择是没有任何异步/未来的老派方法.具体来说,产生多个工作线程并在每个线程的末尾将其结果推送到受互斥锁保护的队列中,该队列通过条件变量通知等待线程,该条件变量已更新队列以获得更多结果.
有没有其他更好的解决方案与异步/未来可能?
在 google 上搜索 std::future::then 时,最上面的结果是关于 c++17 中函数状态的 stackoverflow 问题。现在 c++20 已经完成并且 Clang 和 GCC 正在很好地实现 c++20,我想知道函数和并发 TS 的状态一般是什么?
在libc++、libstdc++的实现状态页面或cppreference 维护的实现状态页面上没有提到它),并且cppreference上的TS 页面没有说明当前状态。
我还尝试在Godbolt上运行一些非常简单的示例,但都无法找到 <experimental/future>,而不是因为它已移至 <future> 标头(都找不到 future::then。
此外,互联网并不是特别有用。至少我只能找到博客文章从1-2年前谈到“希望”来获得并发TS在C + + 20,但无法找到新的C ++ 20个功能(众多概述任何提到一个 小 例子。
并发 TS 是否已删除?