C++笔记之std::future的用法

C++笔记之std::future的用法

code review!

文章目录

  • C++笔记之std::future的用法
    • 1.C++中std::future和std::async总是一起出现吗?
    • 2.主要特点和用法
    • 3.一个完整的例子
    • 4.std::future 存放的是一个结果吗?
    • 5.cppreference——std::future

1.C++中std::future和std::async总是一起出现吗?

在C++中,std::futurestd::async 不一定总是一起出现,但它们通常一起使用,以实现异步任务的执行和结果获取。以下是它们的主要概念和用法:

  1. std::future:

    • std::future 是用于异步操作的结果的容器。它允许您在一个线程中启动一个任务,并在另一个线程中等待任务的结果。
    • 您可以将结果存储在 std::future 对象中,并随后从中获取结果。
    • std::future 可以用于异步执行的任何任务,不仅限于与 std::async 一起使用。
  2. std::async:

    • std::async 是一个函数,用于在后台启动一个异步任务,并返回一个 std::future 对象,以便您可以等待任务的结果。
    • 它允许您以一种相对简单的方式启动异步任务,而无需自己创建线程或管理任务的执行。
    • std::asyncstd::future 的一个典型使用情况。

虽然 std::asyncstd::future 经常一起使用,但您也可以单独使用 std::future 来等待其他异步任务的结果,这些任务可能是通过其他方法创建的,例如手动创建线程、使用库函数等。std::async 只是一种使用 std::future 的便捷方法之一。

综上所述,std::futurestd::async通常一起使用,但它们并不是必然绑定在一起的,您可以根据具体情况单独使用它们。

2.主要特点和用法

std::future是C++标准库中用于处理异步任务的一部分,它提供了一种机制,可以在一个线程中启动一个任务,并在另一个线程中等待任务的完成并获取其结果。std::future通常与std::asyncstd::promisestd::thread等标准库组件一起使用,以实现多线程编程和异步任务处理。

以下是std::future的主要特点和用法:

  1. 创建std::future对象
    你可以使用std::asyncstd::promise来创建std::future对象。std::async用于启动一个异步任务,而std::promise用于生成一个与之关联的std::future对象,它允许你在一个线程中设置任务的结果,然后在另一个线程中获取这个结果。

    示例使用std::async创建std::future

    std::future<int> future_result = std::async(std::launch::async, []() {// 执行异步任务,返回一个int结果return 42;
    });
    
  2. 等待任务完成
    你可以使用std::future::get()函数来等待异步任务的完成,并获取其结果。这个函数会阻塞当前线程,直到任务完成为止。

    示例使用std::future::get()等待任务完成并获取结果:

    int result = future_result.get();
    
  3. 检查任务状态
    使用std::future::wait_for()函数可以检查std::future的状态,以确定任务是否已经完成或是否还在进行中。

    示例检查std::future的状态:

    std::future_status status = future_result.wait_for(std::chrono::seconds(1));
    if (status == std::future_status::ready) {// 任务已完成
    } else if (status == std::future_status::timeout) {// 任务尚未完成,等待超时
    } else if (status == std::future_status::deferred) {// 任务被延迟执行
    }
    
  4. 异常处理
    如果异步任务抛出异常,std::future::get()会重新抛出该异常。你可以使用std::future::valid()函数来检查std::future是否与有效的共享状态相关联。

    示例处理异步任务中的异常:

    try {int result = future_result.get();// 处理结果
    } catch (const std::exception& e) {// 处理异常
    }
    

std::future是多线程和异步编程中非常有用的工具,它允许你管理异步任务的状态和结果,从而更有效地利用多核处理器和并行计算能力。但要小心使用,确保正确处理异常和资源管理,以避免潜在的问题。

3.一个完整的例子

std::future是C++标准库中用于处理异步任务的一部分,它提供了一种机制,可以在一个线程中启动一个任务,并在另一个线程中等待任务的完成并获取其结果。std::future通常与std::asyncstd::promisestd::thread等标准库组件一起使用,以实现多线程编程和异步任务处理。

以下是std::future的主要特点和用法:

  1. 创建std::future对象
    你可以使用std::asyncstd::promise来创建std::future对象。std::async用于启动一个异步任务,而std::promise用于生成一个与之关联的std::future对象,它允许你在一个线程中设置任务的结果,然后在另一个线程中获取这个结果。

    示例使用std::async创建std::future

    std::future<int> future_result = std::async(std::launch::async, []() {// 执行异步任务,返回一个int结果return 42;
    });
    
  2. 等待任务完成
    你可以使用std::future::get()函数来等待异步任务的完成,并获取其结果。这个函数会阻塞当前线程,直到任务完成为止。

    示例使用std::future::get()等待任务完成并获取结果:

    int result = future_result.get();
    
  3. 检查任务状态
    使用std::future::wait_for()函数可以检查std::future的状态,以确定任务是否已经完成或是否还在进行中。

    示例检查std::future的状态:

    std::future_status status = future_result.wait_for(std::chrono::seconds(1));
    if (status == std::future_status::ready) {// 任务已完成
    } else if (status == std::future_status::timeout) {// 任务尚未完成,等待超时
    } else if (status == std::future_status::deferred) {// 任务被延迟执行
    }
    
  4. 异常处理
    如果异步任务抛出异常,std::future::get()会重新抛出该异常。你可以使用std::future::valid()函数来检查std::future是否与有效的共享状态相关联。

    示例处理异步任务中的异常:

    try {int result = future_result.get();// 处理结果
    } catch (const std::exception& e) {// 处理异常
    }
    

std::future是多线程和异步编程中非常有用的工具,它允许你管理异步任务的状态和结果,从而更有效地利用多核处理器和并行计算能力。但要小心使用,确保正确处理异常和资源管理,以避免潜在的问题。

4.std::future 存放的是一个结果吗?

是的,std::future存放的是一个异步任务的结果。异步任务完成后,你可以使用std::future::get()方法来获取任务的结果。这个方法会等待任务完成,然后返回结果。

在前面的示例中,std::async启动了一个异步任务,该任务返回整数值42。我们使用std::future对象来获取这个结果,如下所示:

std::future<int> future_result = std::async(std::launch::async, []() {// 模拟一个耗时操作,返回一个结果std::this_thread::sleep_for(std::chrono::seconds(2));return 42;
});// 使用std::future::get()等待任务完成并获取结果
int result = future_result.get();

在这里,future_result.get()等待任务完成,并返回42作为结果,我们将其存储在result变量中。

所以,std::future是一种用于异步任务结果的容器,它允许你在一个线程中启动任务,在另一个线程中获取任务的结果。

5.cppreference——std::future

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D 生成重建007-Fantasia3D和Magic3d两阶段玩转文生3D

3D生成重建3D 生成重建007-Fantasia3D和magic3d 文章目录 0 论文工作1 论文方法1.1 magic3d1.2 Fantasia3D 2 效果2.1 magic3d2.2 fantasia3d 0 论文工作 两篇论文都是两阶段法进行文生3d&#xff0c;其中fantasia3D主要对形状和外表进行解耦&#xff0c;然后先对geometry进行…

048:mapboxGL本地上传geojson文件,在map上解析显示图形

第048个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中本地上传geojson文件,通过mapbox加载geojson数据的方法解析,在地图上显示图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共112行)相关API…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例评测包管理工具安装软件(六)

七、华为云耀云服务器L实例评测包管理工具安装软件&#xff1a; 根据企业级项目架构图所示&#xff0c;本章主要是安装公司企业项目的基本环境LNMP&#xff0c;相关的包管理器Composer、Node、Npm、Yarn安装&#xff0c;评测一下包管理工具安装软件是否存在问题&#xff0c;如果…

[论文分享] EnBinDiff: Identifying Data-Only Patches for Binaries

EnBinDiff: Identifying Data-Only Patches for Binaries [TDSC 2021] 在本文中&#xff0c;我们将重点介绍纯数据补丁&#xff0c;这是一种不会引起任何结构更改的特定类型的安全补丁。作为导致假阴性的最重要原因之一&#xff0c;纯数据补丁成为影响所有最先进的二进制差分方…

代码生成器实现

代码生成器实现 实现封装元数据的工具类实现代码生成器的代码编写掌握模板创建的 构造数据模型 需求分析 借助Freemarker机制可以方便的根据模板生成文件&#xff0c;同时也是组成代码生成器的核心部分。对于Freemarker而 言&#xff0c;其强调 数据模型 模板 文件 的思…

Java idea查看自定义注解的调用地方

Java idea查看自定义注解的调用地方

学信息系统项目管理师第4版系列27_项目集管理和项目组合管理

1. 项目集发起人 1.1. 负责承诺将组织的资源应用于项目集&#xff0c;并致力于使项目集取得成功的人 1.2. 典型职责 1.2.1. 为项目集提供资金&#xff0c;确保项目集目标与战略愿景保持一致&#xff1b; 1.2.2. 使效益实现交付 1.2.3. 消除项目集管理与交付的困难和障碍 …

Qt 布局(QLayout 类QStackedWidget 类) 总结

一、QLayout类(基本布局) QLayout类是Qt框架中用于管理和排列QWidget控件的布局类。它提供了一种方便而灵活的方式来自动布局QWidget控件。QLayout类允许您以一种简单的方式指定如何安排控件&#xff0c;并能够自动处理控件的位置和大小&#xff0c;以使其适应更改的父窗口的大…

排序优化:如何实现一个通用的、高性能的排序函数?

文章来源于极客时间前google工程师−王争专栏。 几乎所有的编程语言都会提供排序函数&#xff0c;比如java中的Collections.sort()。在平时的开发中&#xff0c;我们都是直接使用&#xff0c;这些排序函数是如何实现的&#xff1f;底层都利用了哪种排序算法呢&#xff1f; 问题…

WPF DataGrid详细列表手动显示与隐藏

设置显示序号与折叠显示样式 <DataTemplate x:Key"dtNum"><Button BorderBrush"Transparent" Style"{x:Null}" Click"BtnRowDetail_ShowHideClick" FontSize"16" Background"Transparent"><Stack…

【ELK 使用指南】ELK + Filebeat 分布式日志管理平台部署

ELK和EFLK 一、前言1.1 日志分析的作用1.2 需要收集的日志1.3 完整日志系统的基本特征 二、ELK概述2.1 ELK简介2.2 为什么要用ELK?2.3 ELK的组件 三、ELK组件详解3.1 Logstash3.1.1 简介3.1.2 Logstash命令常用选项3.1.3 Logstash 的输入和输出流3.1.4 Logstash配置文件 3.2 E…

零代码编程:用ChatGPT批量采集bookroo网页上的英文书目列表

bookroo网页上有很多不错的英文图书书目。比如这个关于儿童花样滑冰的书单&#xff1a; https://bookroo.com/explore/books/topics/ice-skating 怎么批量下载下来呢&#xff1f; 这个网页是动态网页&#xff0c;要爬取下来比较麻烦&#xff0c;可以先查看源代码&#xff0c;…

Leetcode622.设计循环队列

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Leetcode &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…

第五十六章 学习常用技能 - 执行 SQL 查询

文章目录 第五十六章 学习常用技能 - 执行 SQL 查询执行 SQL 查询检查对象属性 第五十六章 学习常用技能 - 执行 SQL 查询 执行 SQL 查询 要运行 SQL 查询&#xff0c;请在管理门户中执行以下操作&#xff1a; 选择系统资源管理器 > SQL。如果需要&#xff0c;请选择标题…

苹果修复了旧款iPhone上的iOS内核零日漏洞

导语 近日&#xff0c;苹果发布了针对旧款iPhone和iPad的安全更新&#xff0c;回溯了一周前发布的补丁&#xff0c;解决了两个被攻击利用的零日漏洞。这些漏洞可能导致攻击者在受影响的设备上提升权限或执行任意代码。本文将介绍这些漏洞的修复情况以及苹果在修复漏洞方面的持续…

创邻科技Galaxybase—激活数据要素的核心引擎

10月11日下午&#xff0c;创邻科技创始人张晨博士受杭州电子科技大学邀请&#xff0c;前往杭电校园开展交流分享。交流会中&#xff0c;张晨博士为现场的师生带来一场题为《图数据库——激活数据要素的新基建》的精彩分享&#xff0c;探讨数字经济时代底层技术的创新价值与图技…

【Java学习之道】线程的概念与作用

引言 今天我们将探索多线程编程的基础概念和作用。对于初学者来说&#xff0c;掌握多线程编程是迈向Java高级技能的重要一步。通过本章的学习&#xff0c;你将了解线程是什么以及它在程序开发中的重要性&#xff0c;为你进一步深入学习和实际工作打下坚实的基础。让我们一起来…

基于微服务+Java+Spring Cloud开发的建筑工地智慧平台源码 云平台多端项目源码

建筑工地智慧平台源码&#xff0c;施工管理端、项目监管端、数据大屏端、移动APP端全套源码 技术架构&#xff1a;微服务JavaSpring Cloud VueUniApp MySql自主版权实际应用案例演示 建筑工地智慧平台已应用于线上巡查、质量管理、实名制管理、危大工程管理、运渣车管理、绿色…

【idea】 java: 找不到符号

idea 启动时提示 java: 找不到符号 java: 找不到符号 符号: 方法 getCompanyDisputeCount() 位置: 类型为com.yang.entity.AreaAnalyse的变量 areaAnalyse 在setting ——> Compiler ——>Shared build process VM options: 添加&#xff1a; -Djps.track.ap.dep…

快速自动化处理JavaScript渲染页面

在进行网络数据抓取时&#xff0c;许多网站使用了JavaScript来动态加载内容&#xff0c;这给传统的网络爬虫带来了一定的挑战。本文将介绍如何使用Selenium和ChromeDriver来实现自动化处理JavaScript渲染页面&#xff0c;并实现有效的数据抓取。 1、Selenium和ChromeDriver简介…