C++ future async promise 用法详解 - shared_future

2023-10-27

shared_future

获得方式

  • 只能由 future 得到

作用

  • 同 future

区别

  • 可以多线程、多次访问 shared state

原理

  • shared state 指针 + 引用计数

基本函数

  • 构造函数、析构函数和赋值操作等

    // valid 情况 1 :false,2 :同参数,且参数 valid 情况不变,3、4 :同参数,且参数 valid 变为 false
    shared_future() noexcept;
    shared_future (const shared_future& x);
    shared_future (shared_future&& x) noexcept;
    shared_future (future<T>&& x) noexcept;
    // shared state 引用计数减一,若为0,shared state 析构
    ~shared_future();
    // 若之前 valid,将之前 shared state 引用计数减一,若为0,shared state 析构
    // 赋值之后 引用计数 +1, valid 同参数,1 : 参数 valid 不变,2 :参数 valid 变为 false
    shared_future& operator= (shared_future&& rhs) noexcept;
    shared_future& operator= (const shared_future& rhs);
    
  • 同步函数

    • 效果跟 future 完全相同
    • 除了 shared state 可以被多个 shared future 共享,并用引用计数维护
    • 可以 多对象、 多线程、 多次调用
    // 是否与 shared state 关联
    // default 构造 false
    bool valid() const noexcept;
    // 当 shared state 为 ready 时,返回 value 或者 抛出异常
    // 不 ready 时,阻塞线程
    R& future<R&>::get();       // when T is a reference type (R&)
    void future<void>::get();   // when T is void
    // 效果同 get(), 但是 不返回 value / exception 的效果
    void wait() const;
    // 效果同 wait(), 但是 等一段时间(timeout_duration) 之后返回
    // 当 deferred function 时,不阻塞
    // future_status::ready、timeout、deferred
    template <class Rep, class Period>
    future_status wait_for (const chrono::duration<Rep,Period>& rel_time) const;
    // 效果同 wait(), 但是 等到(timeout_time) 之后返回
    // 当 deferred function 时,不阻塞
    // future_status::ready、timeout、deferred
    template <class Clock, class Duration>
    future_status wait_until (const chrono::time_point<Clock,Duration>& abs_time) const;
    

基本用法

  • 检查 valid

  • 根据需要调用同步函数

    #include <chrono>
    #include <iostream>
    #include <future>
    #include <vector>
    #include <thread>
     
    int fib(int n) {
      if (n < 3) return 1;
      else return fib(n-1) + fib(n-2);
    }
    
    int main() {
        // future
        std::future<int> f0 = std::async(std::launch::async, [](){
            return fib(1 << 5);
        });
        std::cout << "f0: " << f0.valid() << '\n';
        // shared_future
        std::shared_future<int> f1(std::move(f0));
        std::cout << "f0: " << f0.valid() << '\n';
        std::cout << "f1: " << f1.valid() << '\n';
    
        std::shared_future<int> f2 =  f1;
        std::cout << "f1: " << f1.valid() << '\n';
        std::cout << "f2: " << f2.valid() << '\n';
    
        std::shared_future<int> f3(std::move(f1));
        std::cout << "f1: " << f1.valid() << '\n';
        std::cout << "f2: " << f2.valid() << '\n';
        std::cout << "f3: " << f2.valid() << '\n';
    
        // future
        f0 = std::async(std::launch::async, [](){
            return fib((1 << 5) + (1 << 3));
        });
        std::cout << "f0: " << f0.valid() << '\n';
        // shared_future
        f1 = f0.share();
        std::cout << "f0: " << f0.valid() << '\n';
        std::cout << "f1: " << f1.valid() << '\n';
        std::cout << "f2: " << f2.valid() << '\n';
        std::cout << "f3: " << f2.valid() << '\n';
    
        std::cout << "f1: " << f1.get() << '\n';
        std::cout << "f2: " << f2.get() << '\n';
        std::cout << "f2: " << f3.get() << '\n';
    
        std::vector<std::thread> ts;
        for (size_t i = 0; i < 10; i++)
            ts.emplace_back(std::move(std::thread([&](){
                std::cout << "f1: " << f1.valid() << " " << f1.get() << '\n';
                std::cout << "f2: " << f2.valid() << " " << f2.get() << '\n';
                std::cout << "f3: " << f2.valid() << " " << f2.get() << '\n';
            })));
        for (auto& t : ts) 
            t.join();
        return 0;
    }
    

    未完待续

    • 相关bug
    • 性能测试 & 最佳场景
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ future async promise 用法详解 - shared_future 的相关文章

随机推荐

  • Ubuntu16.04下基于Docker的Caffe-GPU版本环境搭建总结

    Caffe的GPU环境搭建在docker支持下并不困难 但是过程比较杂 所需依赖如下 本文会说明安装方法 帮助大家少走弯路 GNU Linux x86 64 with kernel version gt 3 10 Docker gt 1 9
  • 这是一个更新版本服务代码python

    import win32serviceutil import win32service import win32event import os import logging import inspect import time from u
  • 【计算机网络】实验报告三:Cisco Packet Tracer 实验

    Cisco Packet Tracer 实验 1 直接连接两台 PC 构建 LAN 2 用交换机构建 LAN 3 交换机接口地址列表 4 生成树协议 Spanning Tree Protocol 5 路由器配置初步 6 静态路由 7 动态路
  • 1045 快速排序

    著名的快速排序算法里有一个经典的划分过程 我们通常采用某种方法取一个元素作为主元 通过交换 把比主元小的元素放到它的左边 比主元大的元素放到它的右边 给定划分后的 N 个互不相同的正整数的排列 请问有多少个元素可能是划分前选取的主元 例如给
  • typora高亮_用Typora实现写作排版一体化

    用Typora实现写作排版一体化 一般的推文制作过程 大概都是在本地word写好文案以后 再导入到第三方的推文编辑器中进行排版 最后再黏贴到微信的图文素材编辑器里生成图文发布 经常看到许多公众号文章充满花里胡哨的元素 大概都是因为使用了推文
  • SpringBoot整合Elasticsearch(最新最全,高效安装到使用)

    文章目录 一 安装Elasticsearch相关插件 1 选择版本 2 安装Elasticsearch 3 安装node 4 安装grunt 5 安装es head插件 6 安装kibana 7 安装ik分词器 二 整合SpringBoot
  • 从零开始学编程——DOS命令

    一 DOS操作系统 DOS 英文 Disk Operating System 是一款由微软早期推出的磁盘操作系统 可以通过一系列dos命令直接对硬盘文件进行增删改查 DOS和windiws的最大不同之处在于它是一个字符式操作系统 所有的操作
  • Oracle 表空间查询与操作方法

    一 查询篇 1 查询oracle表空间的使用情况 select b file id 文件ID b tablespace name 表空间 b file name 物理文件名 b bytes 总字节数 b bytes sum nvl a by
  • 自动化办公更简单了:新版python-office,有哪些更新?

    职场经验谈 大家好 这里是程序员晚枫 小破站 小红薯都叫这个名 去年4月开源了一个Python自动化办公项目 python office GitHub和Gitee都能看到 1行代码实现复杂的自动化办公任务 帮助不懂代码的小白 快速使用Pyt
  • Unity鼠标控制物体的旋转、移动、缩放等

    这个是控制相机 44条消息 unity 相机 旋转缩放查看 物体或地图 unity旋转查看物体 野区捕龙为宠的博客 CSDN博客 下面的是控制物体本身 知识点 Input GetMouseButton 0 获取鼠标输入 参数为一个int值
  • QT moveToThread解析

    目录 简介 源码分析 判断是否可以执行移动动作 执行移动动作 调用moveToThread helper 调用setThreadData helper 简介 每一个QObject子类都会关联到一个具体QThread线程上 QObject有一
  • 同一块磁盘下,非lvm的扩容

    1 想要给跟分区扩容 2 先安装growpart yum install cloud utils growpart 3 growpart dev sda 2 发现lsblk看到扩容了 但是实际df还是没扩容 4 需要执行xfs growfs
  • 数据库系统之NoSQL数据库系统

    NoSQL Database Systems 什么是NoSQL数据库系统 为什么使用NoSQL NoSQL数据库系统的属性 半结构化的 无模式的数据模型 专业分布模型 弱一致性 Relaxing durability Versioning
  • 操作系统_03_内存管理(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 为什么要有虚拟地址 使各个进程使用的内存 相互独立 单片机没有操作系
  • 论文笔记之DPG

    原论文地址 阅读DPG的必要性 A2C的难收敛使得policy based向着DDPG发展 而DDPG Deep DPG 因此想要理解DDPG算法 就必须先理解DPG Deterministic Policy Gradient Algori
  • 【QT5 带参connect语法记录】

    QT5 带参connect语法记录 slot版 lamda版 Qt4版 未测试 更多细节参考 slot版 void QListWidget itemClicked2 QListWidgetItem QListWidget itemClick
  • 第三章作业

    例3 1 在一个班级中随机抽取9名学生 得到每名学生的英语考试分数如下 91 69 75 78 81 96 92 88 86 计算9名学生的平均考试分数 解 根据式3 1有 x 91 69 75 78 81 96 92 88 86 9 84
  • 动态生成多个 React createRef

    有这么个需求 从接口获取数据 数据格式为 dataList 接口获取的数据 tableData 表格数据 const dataList tableData1 tableData2 tableData3 需要实现的效果大概长这样 dataLi
  • 【学习SLAM】Bundle Adjustment 光束法平差详解

    首先引述来自维基百科的定义 假设我们有一个3D空间中的点 他被位于不同位置的多个摄像机看到 那么所谓的光束法平差 Bundle Adjustment 就是能够从这些多视角信息中提取出3D点的坐标以及各个摄像机的相对位置和光学信息的过程 可能
  • C++ future async promise 用法详解 - shared_future

    shared future 文章目录 shared future 获得方式 作用 区别 原理 基本函数 基本用法 获得方式 只能由 future 得到 作用 同 future 区别 可以多线程 多次访问 shared state 原理 sh