«
packaged_task代码解析

时间:2026-7-16    作者:范文泉    分类: 编程


调用: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,非常重要。