浅谈C++的future

news2024/10/21 16:13:18

std::future 是 C++ 标准库中的一个模板类,提供了一种机制来管理和获取异步任务的结果。它常与异步操作相关,允许你在不同线程中执行任务,并在将来(即“未来”)某个时刻获取这些任务的结果。std::future 通常和 std::asyncstd::promisestd::packaged_task 等其他类一起使用,用于实现异步编程。

为什么需要 std::future

  1. 异步任务结果管理

    • 当你在一个新线程或异步操作中执行任务时,你希望能够在任务完成后获取它的结果。std::future 提供了一种安全的方式来获取这些结果。
    • thread.join() 不同,future 不会在任务运行时阻塞主线程,它允许主线程继续执行其他操作,直到任务完成。
  2. 任务完成时的同步

    • std::future 提供了阻塞和非阻塞的机制来同步任务。你可以调用 get() 来等待任务完成,也可以使用 wait_for()wait_until() 来检查任务是否已经完成。
  3. 防止数据竞争

    • std::future 的机制避免了线程间的数据共享问题。它通过提供一种类型安全的、线程安全的方式,将任务的结果传递回主线程,而不需要使用锁或其他同步原语来避免数据竞争。

std::future 的基本用法:

std::future 是通过异步调用(如 std::async)生成的。当任务开始执行时,std::future 用于获取该任务的返回值。下面是一个简单的示例,展示了如何使用 std::futurestd::async

#include <iostream>
#include <future>
#include <chrono>
#include <thread>

// 一个简单的异步任务函数
int task() {
    std::this_thread::sleep_for(std::chrono::seconds(2));  // 模拟耗时任务
    return 42;
}

int main() {
    // 使用 std::async 启动异步任务,并返回 future 对象
    std::future<int> result = std::async(std::launch::async, task);

    // 主线程可以在此期间做其他事情
    std::cout << "Doing other work in main thread...\n";

    // 阻塞等待异步任务完成,并获取结果
    int value = result.get();  // 这里阻塞直到 task() 完成并返回结果
    std::cout << "Task result: " << value << std::endl;

    return 0;
}

解释:

  1. std::async:它启动一个异步任务(可以理解为在另一个线程中运行),并返回一个 std::future 对象。
  2. std::future:它包含了任务的返回值。在调用 result.get() 之前,std::future 中的结果是不可用的。get() 会阻塞当前线程,直到异步任务完成并返回结果。
  3. 任务的异步执行:在调用 result.get() 之前,主线程不会被任务阻塞,可以继续执行其他操作。

std::future 的关键操作:

  1. get()

    • 阻塞当前线程,直到异步任务完成,并返回任务的结果。
    • 如果任务已经完成,get() 会立即返回结果。
    • 只能调用一次,调用后 std::future 将不再拥有结果。
  2. wait()

    • 阻塞当前线程,直到异步任务完成,但不会返回任务的结果。可以用于等待任务完成,但不需要立即获取结果。
  3. wait_for(duration)

    • 阻塞一段指定的时间(duration),如果任务在这段时间内完成,则返回 std::future_status::ready,否则返回 timeoutdeferred
  4. wait_until(time_point)

    • 等待直到某个时间点,如果任务在此之前完成,则返回 std::future_status::ready

std::future 的典型应用场景:

  1. 异步任务的返回值

    • 当你需要在另一个线程中执行一个任务,并且希望稍后获取这个任务的返回值,std::future 就是最好的选择。例如在下载文件、计算密集型任务等场景中,可以在后台线程执行任务,主线程继续其他操作,任务完成时再获取结果。
  2. 并行计算

    • 你可以使用多个 std::future 来并行运行多个任务,并在所有任务完成后再获取所有的结果。
  3. 异步回调替代

    • 传统的异步编程通常使用回调函数来处理任务的完成状态,但 std::future 提供了一种更加简洁和清晰的方式来管理异步任务,避免了回调地狱的问题。

为什么要有 std::future 这种属性的存在?

  1. 简化异步编程

    • std::future 使得异步编程更加简洁直观,你可以像处理普通返回值一样处理异步任务的结果,而不必编写复杂的同步代码。
  2. 避免共享数据竞争

    • std::future 提供了一种无需锁定和同步机制的安全方式来在线程间传递数据,避免了传统多线程编程中的数据竞争问题。
  3. 灵活的任务管理

    • 通过 wait()wait_for() 等方法,std::future 允许你灵活控制任务的执行和结果获取方式。例如,你可以选择阻塞等待任务,或者选择轮询任务状态以避免阻塞。

总结:

std::future 提供了一种便捷的方式来处理异步任务的结果。它允许在异步任务运行的同时,主线程继续执行其他操作,直到任务完成后再获取结果。这种机制避免了使用回调函数的复杂性和数据竞争问题,简化了异步编程模型。

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

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

相关文章

华为ICT大赛2024-2025网络赛道考试分析

华为ICT大赛2024-2025正在报名中&#xff0c;网络赛道的同学如何备考&#xff0c;了解考试内容呢&#xff1f; 一、考试概况 华为ICT大赛分为4个赛段&#xff0c;分别为省赛初赛、省赛复赛、中国总决赛&#xff0c;全球总决赛。其中对应的能力级别分别如下&#xff1a; 省赛…

PHP爬虫API:获取商品详情的新利器

为什么选择PHP爬虫API 灵活的数据处理&#xff1a;PHP强大的数据处理能力&#xff0c;使得从API获取的数据可以被快速地处理和分析。丰富的库支持&#xff1a;PHP拥有如cURL、Guzzle等库&#xff0c;这些库简化了HTTP请求的发送和响应的接收。易于集成&#xff1a;PHP作为服务…

无人机搭载激光雷达在地形测绘中的多元应用

一、高精度地形测量 无人机激光雷达能够发射激光脉冲并接收其回波&#xff0c;通过精确计算激光脉冲的往返时间来确定目标物的距离。这一特性使得无人机激光雷达在地形测绘中能够实现高精度的三维地形测量。通过快速获取大量地形数据&#xff0c;可以生成高精度的数字高程模型…

pytorh学习笔记——cifar10(一)生成数据

CIFAR&#xff08;Canadian Institute For Advanced Research&#xff09;是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集&#xff0c;最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像&#xff0c;分为10个类别&#xff0c;每…

SpringCloud无介绍快使用,单机Eureka服务注册中心cloud-eureka-server7001搭建(十)

TOC 问题背景 从零开始学springcloud微服务项目 注意事项&#xff1a; 约定 > 配置 > 编码IDEA版本2021.1这个项目&#xff0c;我分了很多篇章&#xff0c;每篇文章一个操作步骤&#xff0c;目的是显得更简单明了controller调service&#xff0c;service调dao项目源码以及…

Python学习的自我理解和想法(17)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第17天&#xff0c;学的内容是面向对象设计。开学了&#xff0c;时间不多&#xff0c;写得不多&#xff0c;见谅。 目录 1.面向对象入门 …

基于PHP+MySQL+Vue的网上订餐系统

摘要 本文介绍了一个基于PHPMySQLVue技术的网上订餐系统。该系统旨在为用户提供便捷的在线订餐服务&#xff0c;同时提高餐厅的运营效率。系统后端采用PHP语言开发&#xff0c;利用MySQL数据库进行数据存储与管理&#xff0c;实现了用户注册登录、菜品浏览、购物车管理、订单提…

es kibana .logstash离线集群安装

es离线集群安装 下载对应的版本一般看你客户端引用的是什么版本我这里下载的是7.6.2 官方下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 源码安装-环境准备&#xff1a;在etc/hosts文件添加3台主机 node-001 192.168.1.81 node-002 19…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取&#xff0c;格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

微信小程序:miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具

微信小程序&#xff1a;miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具 背景介绍 一直都是本地电脑运行微信开发者工具打包上传。多项目中新老版本对node版本要求不一致&#xff0c;老是切来切去。而且同一个人开发上传需要打包…

求最大公约数(c语言)

先看题&#x1f447; 我这里介绍的方法&#xff1a;辗转相除法&#xff1a; 最大公约数&#xff1a; 最大公约数是指同时能整除俩个或更多整数的最大正整数。 欧几里得算法就是求最大公约数的算法 求最大公约数涉及到一个数学原理的转换: 俩个数的最大公约数等于其中一个数和…

关于我、重生到500年前凭借C语言改变世界科技vlog.7——数组函数实践

文章目录 扫雷游戏专题1.扫雷游戏的设计分析1.1 棋盘1.2 文件 2.扫雷游戏的实现3.扫雷游戏的扩展 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 扫雷游戏专题 掌握了前面的数组与函数的知识&#xff0c;我们可以制作一款大多电脑上都有的简易…

公交信息在线查询系统|基于java和小程序的公交信息在线查询系统小程序设计与实现(源码+数据库+文档)

公交信息在线查询系统小程序 目录 基于java和小程序的公交信息在线查询系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂…

解锁文本数据可视化的无限可能:Wordcloud库全解析

文章目录 **&#x1f31f;解锁文本数据可视化的无限可能&#xff1a;Wordcloud库全解析&#x1f510;**1. **背景介绍**2. **Wordcloud库是什么&#xff1f;**3. **如何安装Wordcloud库&#xff1f;**4. **Wordcloud库的基本函数使用方法**5. **实际应用场景**6. **常见问题及解…

VUE 仿神州租车-开放平台

项目背景&#xff1a; 神州租车是一家提供汽车租赁服务的公司&#xff0c;其API开放平台为开发者提供了访问神州租车相关服务和数据的接口。用VUE技术来仿照其开发平台。 成果展示&#xff1a; 首页&#xff1a; API文档&#xff1a; 关于我们&#xff1a;

MyBatis实践:提高持久层数据处理效率

文章目录 1 Mybatis简介1.1 简介1.2 持久层框架对比 2 快速入门2.1 准备数据库2.2 项目搭建2.3 依赖导入2.4 准备MyBatis配置文件2.5 实体类准备2.6 准备Mapper接口和MapperXML文件2.7 运行和测试 3. 核心配置文件4. MyBatis进阶使用4.0 以包为单位&#xff0c;引入所有的映射文…

算法Day-4

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,…

Windows10去掉隐藏文件仍找不到hosts文件的解决办法

正常情况下hosts文件在目录C:\Windows\System32\drivers\etc中&#xff0c;最近新装的Windows10系统发现该目录下没有hosts文件。 执行如下命令hosts文件出现&#xff1a; 执行 for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\drivers\etc &am…

ubuntu 20.04 网卡启用后,只有ipv6 没有 ipv4 无法上网

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

JS | JS之深入理解客户区尺寸client系列属性

目录 一、客户区大小 clientHeight clientWidth clientLeft clientTop 二、页面大小 三、注意事项 关于元素尺寸&#xff0c;一般地&#xff0c;有偏移大小offset、客户区大小client和滚动大小scroll。前文已经介绍过偏移属性&#xff0c;后文将介绍scroll滚动大小&…