ananas future分析
  ZXL8ALkrtBPG 2023年11月02日 39 0
cpp

在《异步编程:promise and future》一文中对promise & future异步编程进行了介绍,文中对“回调地狱”也进行简单说明,本文对其中一种开源方案源码进行分析;

uml类图

ananas future分析_cpp

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活动图

ananas future分析_cpp_02

Promise和Future共享一个State状态,State中存有下一级的回调函数,函数中执行下一级的SetVaule,Promise的SetVaule为触发下一级执行的trigger。

此外还有WhenAny、WhenAll等接口,了解Then的实现后,相信其他实现不难理解;

ananas future分析_cpp_03

参考资料:

【1】https://github.com/loveyacper/ananas

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  ZXL8ALkrtBPG   2023年11月02日   50   0   0 cpp
  PQYWJLBjS0G7   2023年11月02日   49   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   69   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   40   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   39   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   48   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   83   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   35   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   29   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   36   0   0 cpp
  ZXL8ALkrtBPG   2023年11月19日   18   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   59   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   70   0   0 Listcpp
  ZXL8ALkrtBPG   2023年11月02日   47   0   0 cpp
  ZXL8ALkrtBPG   2023年11月02日   69   0   0 cpp
  ZXL8ALkrtBPG   2023年11月19日   31   0   0 cpp
ZXL8ALkrtBPG