• std::promise 源码分析


    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方法,因此并没有进行等待执行完成

  • 相关阅读:
    高数_第3章_重积分_习题
    动手实践:从栈帧看字节码是如何在 JVM 中进行流转的
    【vue】vue本地储存、会话存储插件vue-ls的使用:
    如何使用KEIL5快速建立FreeRTOS项目(附建立成功的源代码以及问题解析)
    MySQL查询优化与调优
    speedpdf怎么免费合并多个pdf
    鸿蒙入门05-真机运行“遥遥领先”
    用较新版本的Android Studio Chipmunk编译旧版本的Android 21的Sample
    [免费专栏] Android安全之ZIP文件目录遍历漏洞
    http https http2 http3
  • 原文地址:https://blog.csdn.net/c553110519/article/details/126272952