使用std::future和std::async的依赖关系求解器
Dependency solver using std::future and std::async
我正在尝试使用std::future
和std::async
实现一个简单的依赖关系求解器。目前我不明白这样做是否可能。问题是,我们可以将(尚未可用的)future
呼叫传递给async
吗?如果没有,那么实际可以做些什么来让一些尚未就绪的输入的函数链相互调用呢?也许,有可能覆盖传递给延迟异步的值?
也许我的描述令人费解,所以这里有一个例子:
#include <iostream>
#include <future>
#include <map>
using namespace std;
int adder(future<int> a, future<int> b) {
return a.get() + b.get();
}
int main() {
map<char, future<int>> scheme;
scheme['c'] = future<int>(async(launch::deferred, [] { return 1;}));
scheme['a'] = future<int>(async(launch::deferred, adder, move(scheme['b']), move(scheme['c'])));
scheme['b'] = future<int>(async(launch::deferred, [] { return 3;}));
cout << scheme['a'].get() << endl;
}
我们应该有这样一个方案:
c
a ----- result
/
b
以及CCD_ 5。此代码失败:move
只获取一个空的future
并将其传递给adder
。如果我们用'a'
和'b'
交换行,它会很好地工作,但这样我们就应该知道依赖关系了。
使用promise。也许还有未来的未来。
template<class T>
struct problem {
std::promise<std::shared_future<T>> p;
std::shared_future<std::shared_future<T>> f;
problem():f(p.get_future()){}
template<class W, class...Args>
void set(W&&work, Args&&...args){
p.set_value(std::async(std::launch::deferred, std::forward<W>(work), std::forward<Args>(args)...));
}
T get(){
return f.get().get();
}
};
int adder(problem<int>& a, problem<int>& b) {
return a.get() + b.get();
}
int main() {
std::map<char, problem<int>> scheme;
scheme['c'].set([] { return 1;} );
scheme['a'].set(adder, std::ref(scheme['b']), std::ref(scheme['c']));
scheme['b'].set([] { return 3;} );
std::cout << scheme['a'].get() << 'n';
}
可能有更简单的方法。
活生生的例子。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- C++ODB数据库映射程序:无法在关系中使用std::weak_ptr
- "std::shared_ptr"循环依赖关系是如何导致问题的
- std::没有等价关系的唯一示例(删除连续空格)
- 使用 std::map 和 std::list 的 MRU 构造中的循环依赖关系
- boost::exception 和 std::exception 之间的关系
- 使用std::future和std::async的依赖关系求解器
- std::unordered_set中hasher和key_equal之间的关系
- iostream和命名空间std之间的关系是什么?