std::promise 源码分析
本次采用的xcode stdc++11 对应的源码分析
std::future 介绍
在std::async 源码解析的时候 已经对future做过分析,这里就不过多介绍
std::promise 定义
C++ template <class _Rp> class promise { __assoc_state<_Rp>* __state_;
_LIBCPP_INLINE_VISIBILITY explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
template <class> friend class packaged_task; public: promise(); template <class _Alloc> promise(allocator_arg_t, const _Alloc& __a); _LIBCPP_INLINE_VISIBILITY promise(promise&& __rhs) _NOEXCEPT : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} promise(const promise& __rhs) = delete; ~promise();
// assignment _LIBCPP_INLINE_VISIBILITY promise& operator=(promise&& __rhs) _NOEXCEPT { promise(_VSTD::move(__rhs)).swap(*this); return *this; } promise& operator=(const promise& __rhs) = delete;
_LIBCPP_INLINE_VISIBILITY void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
// retrieving the result future<_Rp> get_future();
// setting the result void set_value(const _Rp& __r); void set_value(_Rp&& __r); void set_exception(exception_ptr __p);
// setting the result with deferred notification void set_value_at_thread_exit(const _Rp& __r); void set_value_at_thread_exit(_Rp&& __r); void set_exception_at_thread_exit(exception_ptr __p); }; |
__assoc_state<_Rp>* __state_
C++ template <class _Rp> class __assoc_state : public __assoc_sub_state { typedef __assoc_sub_state base; typedef typename aligned_storage<sizeof(_Rp), alignment_of<_Rp>::value>::type _Up; protected: _Up __value_;
virtual void __on_zero_shared() _NOEXCEPT; public:
template <class _Arg> void set_value(_Arg&& __arg);
template <class _Arg> void set_value_at_thread_exit(_Arg&& __arg);
_Rp move(); typename add_lvalue_reference<_Rp>::type copy(); }; |
这个跟async 有点不一样的是,async 是__assoc_state的子类__async_assoc_state
这个__async_assoc_state 与 __assoc_state 里的__on_zero_shared 实现方式不一致
promise获取future在释放为什么没有等待
还记得std::async 里边有个问题是,为什么async 派生的future在释放的会等待任务执行完毕,而promise并没有要求等待,为什么会这样呢
接下来看下__assoc_state::__on_zero_shared 的实现
__assoc_state::__on_zero_shared
C++ template <class _Rp> void __assoc_state<_Rp>::__on_zero_shared() _NOEXCEPT { if (this->__state_ & base::__constructed)//判断_RP 是否有溪沟对象 reinterpret_cast<_Rp*>(&__value_)->~_Rp();//调用Rp的西沟方法 delete this; } |
也就是说__assoc_state::__on_zero_shared 并没有调用wait方法,因此并没有进行等待执行完成