在《异步编程:promise and future》一文中对promise & future异步编程进行了介绍,文中对“回调地狱”也进行简单说明,本文对其中一种开源方案源码进行分析;
uml类图
Promise和Future对象共享一个State状态,其数据结构为:
enum class Progress {
None,
Timeout,
Done,
Retrieved,
};
using TimeoutCallback = std::function<void ()>;
template <typename T>
struct State {
static_assert(std::is_same<T, void>::value ||
std::is_copy_constructible<T>() ||
std::is_move_constructible<T>(),
"must be copyable or movable or void");
State() :
progress_(Progress::None),
retrieved_ {false} {
}
std::mutex thenLock_;
using ValueType = typename TryWrapper<T>::Type;
ValueType value_; // 当前处理结果
std::function<void (ValueType&& )> then_; // 下一级处理
Progress progress_; // 当前处理状态
std::function<void (TimeoutCallback&& )> onTimeout_;
std::atomic<bool> retrieved_;
bool IsRoot() const {
return !onTimeout_;
}
};
根据以下用例分析实现:
ananas::ThreadPool tpool;
Future<int> ft(tpool.Execute(ThreadFunc<int>));
ft.Then([](int v) {
std::cout << "1.Then got int value " << v
<< " and return float 1.0f." << std::endl;
return 1.0f;
})
.Then([](float f) {
std::cout << "2.Then got float value " << f
<< " and return 2." << std::endl;
return 2;
})
Then活动图
Promise和Future共享一个State状态,State中存有下一级的回调函数,函数中执行下一级的SetVaule,Promise的SetVaule为触发下一级执行的trigger。
此外还有WhenAny、WhenAll等接口,了解Then的实现后,相信其他实现不难理解;
参考资料:
【1】https://github.com/loveyacper/ananas
标签:分析,std,function,ananas,State,future,Promise,Progress From: https://blog.51cto.com/u_13137973/7339996