【C++ 异步任务 】`std::future`

news2024/11/27 16:38:48

在这里插入图片描述

1.基础知识

std::future 是 C++ 标准库中的一个类模板,定义在 <future> 头文件中。它提供了一种异步操作的机制,用于获取异步任务的结果。

std::future 类模板表示一个未来可能会获得的值。你可以将一个异步任务交给 std::future 来管理,并在需要结果时获取该值。

下面是一些常用的 std::future 相关的类和函数:

  • std::future<T>std::future 类模板用于持有异步操作的结果。它模拟一个尚不存在的值,并提供一些方法来等待该值的完成并获取结果。

  • std::promise<T>std::promise 类模板用于设置异步操作的结果。你可以创建一个 std::promise 对象,并将它与一个 std::future 关联起来。通过调用 std::promise 对象的 set_value 方法,可以设置异步任务的结果,进而使关联的 std::future 对象可以获取到结果。

  • std::asyncstd::async 是一个函数模板,可以用于异步地执行函数或函数对象,并返回一个 std::future 对象以表示异步操作的结果。std::async 接受一个函数或函数对象作为参数,并创建一个异步任务来执行该函数或函数对象。

  • std::future_statusstd::future_status 是一个枚举类型,用于表示 std::future 对象的状态。它定义了三个值:deferred(延迟执行)、ready(已就绪)和 timeout(超时)。

  • std::shared_future<T>std::shared_futurestd::future 的共享版本。与 std::future 不同,std::shared_future 可以被多个线程共享,并且可以被拷贝。

使用 std::future,你可以在一个线程中启动一个异步任务,并在另一个线程中等待它的完成并获取结果。这提供了一种方便和高效的方式来处理并发编程中的异步操作。

请注意,<future> 头文件同时还包含其他相关的类和函数,比如 std::packaged_taskstd::asyncstd::when_all 等。你可以阅读相关的文档和参考资料来深入了解这些内容。

2. 举例实现

void processFrames() {
  if (options_.use_async_reproj && cams_->numCameras() > 1) {
    // 启动异步任务并且等待所有任务完成
    std::vector<std::future<void>> reproj_workers;
    for (size_t camera_idx = 0; camera_idx < cams_->numCameras(); ++camera_idx) {
      auto func = std::bind(&Reproj::reproFrames, reprojectors_.at(camera_idx).get(),
                            new_frames_->at(camera_idx), overlap_kfs_.at(camera_idx), trash_points.at(camera_idx));
      reproj_workers.push_back(std::async(std::launch::async, func));
    }

    // 等待所有异步任务完成
    for (auto& worker : reproj_workers) {
      worker.get();
    }
  } else {
    // 同步执行任务
    for (size_t camera_idx = 0; camera_idx < cams_->numCameras(); ++camera_idx) {
      reproj_.at(camera_idx)
          ->reprojFrames(new_frames_->at(camera_idx), overlap_kfs_.at(camera_idx), trash_points.at(camera_idx));
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苍穹外卖-day08 java实现 微信支付

苍穹外卖-day08 课程内容 导入地址簿功能代码用户下单订单支付 功能实现&#xff1a;用户下单、订单支付 用户下单效果图&#xff1a; 订单支付效果图&#xff1a; 1. 导入地址簿功能代码 1.1 需求分析和设计 1.1.1 产品原型 地址簿&#xff0c;指的是消费者用户的地址信息&…

Django学习笔记-视图(views)的使用

Django中可以使用views进行管理&#xff0c;类似于WPF的MVVM的ViewModel层&#xff0c;也相当于MVC架构的模Controller层。 一、基于函数的视图FBV&#xff08;Function-Based View&#xff09; 通过定义一个函数&#xff0c;包含HttpRequest对象作为参数&#xff0c;用来接受…

运维高级--shell脚本完成分库分表

为什么要进行分库分表 随着系统的运行&#xff0c;存储的数据量会越来越大&#xff0c;系统的访问的压力也会随之增大&#xff0c;如果一个库中的表数据超过了一定的数量&#xff0c;比如说MySQL中的表数据达到千万级别&#xff0c;就需要考虑进行分库分表&#xff1b; 其…

分享几个电脑录制GIF图片的小工具(附下载链接)

GIF工具 1.GIF1232.ScreentoGif3.gifcam4.LICECAP5.recordit 1.GIF123 点击下载: GIF123 介绍 GIF123&#xff1a;是单文件的绿色软件&#xff0c;无任何外部依赖项&#xff0c;体积仅755KB&#xff0c;支持windows所有版本操作简单&#xff01;&#xff01; 2.ScreentoGif …

梯度提升树的参数

目录 1. 迭代过程 1.1 初始预测结果的设置 1.2 使用回归器完成分类任务 ① 二分类情况 ② 多分类情况 1.3 GBDT的8种损失函数 ① 分类器中的loss a. 二分类交叉熵损失 b. 多分类交叉熵损失 c. 二分类指数损失 d. 多分类指数损失 ② 回归树中的loss a. 平方误差 b…

JPA连接达梦数据库导致auto-ddl失效问题解决

现象&#xff1a; 项目使用了JPA&#xff0c;并且auto-ddl设置的为update&#xff0c;在连接达梦数据库的时候&#xff0c;第一次启动没有问题&#xff0c;但是后面重启就会报错&#xff0c;发现错误为重复建表&#xff0c;也就是说已经建好的表没有检测到&#xff0c;…

spring 的循环依赖以及spring为什么要用三级缓存解决循环依赖

知识铺垫 bean的生命周期 这里简单过一下 class ->无参构造 ->普通对象 ->依赖注入&#xff08;对加了autowire等的属性赋值&#xff09; ->初始化前->初始化 ->初始化后&#xff08;aop&#xff09; ->放入单例池的map&#xff08;一级缓存&#xff09;…

第二次作业 运维高级 MySQL主从复制

1.理解MySQL主从复制原理 1、master&#xff08;binlog dump thread&#xff09;主要负责Master库中有数据更新的时候&#xff0c;会按照binlog格式&#xff0c;将更新的事件类型写入到主库的binlog文件中。 2、I/O thread线程在Slave中创建&#xff0c;该线程用于请求Master&…

有些能力,是工作中学不来的,看看这篇超过90%同行

俗话说:360行&#xff0c;行行转IT。 在就业形势压力巨大的今天&#xff0c;不仅仅是计算机专业的毕业生&#xff0c;很多其他专业的大学生都选择转行从事计算机行业。 尤其是软件测试行业&#xff0c;远远超出其他行业的薪水和广阔的就业前景&#xff0c;吸引了大批应届毕业…

PostgreSQL——Windows上安装PostgreSQL

下载地址&#xff1a;PostgreSQL下载网址 因为某些问题我自己安装的是postgresql-11.2-1-windows-x64 根据下图顺序安装即可&#xff0c;不同版本可能顺序有点区别但每部分目的都是一样的。 首先右键以管理员身份运行&#xff0c;可以弹出安装界面

多通道振动信号经小波变换成多通道信息融合的图像(Python编程)

1.数据集介绍&#xff1a;凯斯西楚大学轴承数据集&#xff08;12KHZ采样频率下&#xff0c;四种不同负载数据集&#xff09; 2.这里以0HP文件夹为例&#xff0c;进行展示&#xff0c;有内圈故障&#xff0c;正常&#xff0c;外圈故障和滚动体故障四个文件夹 内圈故障文件夹下有…

【2023周报】week23 eBPF学习

week23 eBPF学习 如何调试eBPF程序&#xff1f; bpf SystemCall [bpf(2) - Linux manual page (man7.org)](https://man7.org/linux/man-pages/man2/bpf.2.html) [bpf-helpers(7) - Linux manual page (man7.org)](https://man7.org/linux/man-pages/man7/bpf-helpers.7.htm…

Python基本语法之符号使用

好久没有和小伙伴们更新python了&#xff0c;我对于此感到抱歉以后有时间尽量多更新 目录 一. 标识符 A.定义&#xff1a; B.使用特点 C.Python标识符&#xff0c;进一步探讨以下几个方面的详细内容&#xff1a; 1. 规则和约定&#xff1a; 2. 有效的标识符示例&#xff1…

【LeetCode每日一题】——剑指 Offer II 027.回文链表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【题目注意】九【解题思路】十【时间频度】十一【代码实现】十二【提交结果】 一【题目类别】 栈 二【题目难度】 简单 三【题目编号】 剑指 Offer II 02…

3.1flex布局

参考链接 MDN 核心组成 容器 容器指定元素item的布局方式 元素 元素自定义自身的宽度大小

高数笔记02:导数、微分、中值定理

图源&#xff1a;文心一言 本文是我学习高等数学第二、三章导数、微分、中值定理的一些笔记和心得&#xff0c;希望可以与考研路上的小伙伴一起努力上岸~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图、归纳题型~&#x1f9e9;&#x1f9e9; 参考用书1&…

Tomcat修改端口号

网上的教程都比较老&#xff0c;今天用tomcat9.0记录一下 conf文件夹下server.xml文件 刚开始改了打红叉的地方&#xff0c;发现没用&#xff0c;改了上面那行

SpringBoot整合第三方 Druid、MybatisPlus、Mybatis

整合第三方技术 整合JUnit Respostory 注解&#xff1a;数据类 1、导入测试对应的starter 2、测试类使用 SpringBootTest 修饰 3、使用自动装配的形式添加要测试的对象 classes的属性 其实主要找的是SpringBootApplication中的SpringBootConfiguration这个注解。也就是配置…

【Axure高保真原型】标准金额格式输入框

今天和大家分享标准金额格式输入框的原型模板&#xff0c;在输入框里输入数字后&#xff0c;会自动将对应的数字转为标准金额格式输入&#xff0c;自动添加千分位&#xff0c;例如输入2000&#xff0c;输入内容为2,000.00。具体效果可以观看下方视频或者打开预览地址体验 【原…

三星发布新智能手表:旋转边框回归,Galaxy Watch6 系列震撼来袭

今晚&#xff0c;三星发布了最新的Galaxy Watch6系列智能手表&#xff0c;其中包括Galaxy Watch6和Watch6 Classic两款。Watch6 Classic再次引入了三星手表所独有的旋转边框特色。这两款手表提供多种尺寸和支持LTE的版本&#xff0c;同时还搭载了内置的eSIM模块&#xff0c;为用…