调用:auto task = std::packaged_task<int(int a, int b)>(Test);
packaged_task构造函数:
template <class _Fty2, enable_if_t<!is_same_v<_Remove_cvref_t<_Fty2>, packaged_task>, int> = 0>
explicit packaged_task(_Fty2&& _Fnarg) : _MyPromise(new _MyStateType(_STD forward<_Fty2>(_Fnarg))) {}
packaged_task重载()
void operator()(_ArgTypes... _Args) {
if (_MyPromise._Is_ready()) {
_Throw_future_error(make_error_code(future_errc::promise_already_satisfied));
}
_MyStateManagerType& _State = _MyPromise._Get_state_for_set();
_MyStateType* _Ptr = static_cast<_MyStateType*>(_State._Ptr());
_Ptr->_Call_immediate(_STD forward<_ArgTypes>(_Args)...);
}
首先检查mypromise状态,然后取出promise的_MyStateManagerType<_Packaged_state>,调用_Call_immediate,
void _Call_immediate(_ArgTypes... _Args) { // call function object
_TRY_BEGIN
// call function object and catch exceptions
this->_Set_value(_Fn(_STD forward<_ArgTypes>(_Args)...), false);
_CATCH_ALL
// function object threw exception; record result
this->_Set_exception(_STD current_exception(), false);
_CATCH_END
}
这个函数里面_Fn(_STD forward<_ArgTypes>(_Args)...)调用完成后调用this->_Set_value,如果有异常,调用this->_Set_exception(_STD current_exception(), false);
其中_Set_value是父类里,实现如下
void _Set_value(const _Ty& _Val, bool _At_thread_exit) { // store a result
unique_lock<mutex> _Lock(_Mtx);
_Set_value_raw(_Val, &_Lock, _At_thread_exit);
}
void _Set_value_raw(const _Ty& _Val, unique_lock<mutex>* _Lock,
bool _At_thread_exit) { // store a result while inside a locked block
if (_Has_stored_result) {
_Throw_future_error(make_error_code(future_errc::promise_already_satisfied));
}
_Result = _Val;
_Do_notify(_Lock, _At_thread_exit);
}
virtual void _Do_notify(unique_lock<mutex>* _Lock, bool _At_thread_exit) { // notify waiting threads
// TRANSITION, ABI: This is virtual, but never overridden.
_Has_stored_result = true;
if (_At_thread_exit) { // notify at thread exit
_Cond._Register(*_Lock, &_Ready);
} else { // notify immediately
_Ready = true;
_Cond.notify_all();
}
}
这里的_Cond.notify_all();就是condition_variable _Cond;
还有一个重要函数
_NODISCARD future<_Ret> get_future() {
return future<_Ret>(_MyPromise._Get_state_for_future(), _Nil());
}
get_future和这些调用的扭带就是_MyPromise,非常重要。