以下示例取自C++ async tutorial:
#include <future>
#include <iostream>
#include <vector>
int twice(int m) { return 2 * m; }
int main() {
std::vector<std::future<int>> futures;
for(int i = 0; i < 10; ++i) { futures.push_back (std::async(twice, i)); }
//retrive and print the value stored in the future
for(auto &e : futures) { std::cout << e.get() << std::endl; }
return 0;
}
如何在不等待的情况下使用future
的结果?即我想做这样的事情:
int sum = 0;
for(auto &e : futures) { sum += someLengthyCalculation(e.get()); }
我可以将对future
的引用传递给someLengthyCalculation
,但在某些时候我必须调用get
来检索值,因此我不知道如何编写它而无需等待对于第一个元素完成,在下一个元素开始求和之前。
答案 0 :(得分:4)
您是对的,目前的future
库尚未完成。我们想念的是一种表示'未来x准备就绪,开始运行f'的方法。这是一个不错的post about that。
你可能需要的是map / reduce实现:在每个未来完成时,你想开始将它添加到累加器(reduce)。
你可以使用一个库 - 自己构建它并不是很简单:)。其中一个获得牵引力的图书馆是RxCpp--他们有一个post on map/reduce。
答案 1 :(得分:1)
期货的设计适用于这种解决方案,您可以创建更多代表计算值的期货:
std::vector<std::future<int>> calculated_futures;
for (auto &e : futures) {
calculated_futures.push_back(
std::async([&e]{ return someLengthyCalculation(e.get()); })
);
}
int sum = 0;
for(auto &e : calculated_futures) { sum += e.get(); }