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.mzph.cn/news/105351.shtml

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

相关文章

数据分析基础:数据可视化+数据分析报告

数据分析是指通过对大量数据进行收集、整理、处理和分析&#xff0c;以发现其中的模式、趋势和关联&#xff0c;并从中提取有价值的信息和知识。 数据可视化和数据分析报告是数据分析过程中非常重要的两个环节&#xff0c;它们帮助将数据转化为易于理解和传达的形式&#xff0…

C++ - git 命令行

为什么要有 git 你很可能遇到过这种情况&#xff0c;在写项目的时候&#xff0c;要我不符合 leader 的要求&#xff0c;因而修改了很多个版本&#xff0c;但是修改到最后一版的时候&#xff0c;leader 有觉得当前这版还没有之前 某一版好&#xff0c;现在又要求你在 之前的那一…

KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(8)

接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(7) 上一回讲到了drm_internal_framebuffer_create函数中的framebuffer_check函数中的drm_get_format_info函数,讲解了该函数的第一部分暨前一部分,本文讲解后一部分。为了便于理解以及理清脉络和当前所…

OJ项目——用户的登录拦截,我是如何实现的?

目录 前言 1、关于Session该如何处理 简单session回顾&#xff1a; 回顾session的setAttribute、getAttribute : 项目中如何做&#xff1f; 2、登陆拦截器实现 自定义拦截器&#xff1a; 自定义拦截&#xff1a; 前言 博主之前也有出过一期关于拦截器的&#xff0c;大…

Zabbix监控系统详解2:基于Proxy分布式实现Web应用监控及Zabbix 高可用集群的搭建

文章目录 1. zabbix-proxy的分布式监控的概述1.1 分布式监控的主要作用1.2 监控数据流向1.3 构成组件1.3.1 zabbix-server1.3.2 Database1.3.3 zabbix-proxy1.3.4 zabbix-agent1.3.5 web 界面 2. 部署zabbix代理服务器2.1 前置准备2.2 配置 zabbix 的下载源&#xff0c;安装 za…

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

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

【c++】向webrtc学AheadOf、IsNewerTimestamp比较

webrtc源码分析-rtp序列号新旧比较 大神文章分析的非常到位。大神分析:AheadOrAt(a, b)是判断a是否比b新的核心,其原理是这样的:rfc1982规定了序列号递增间隔不能超过取值范围的1/2(这是自己理解的),那么要判断a是否比b新,只要判断b到a的递增是否在1/2即可,递增超过1/2,…

Golang中gRPC使用及原理探究

文章目录 概述gRPC的优势&#xff1a; 1、gRPC入门1.1 protobuf安装1.2 使用gRPC1.2.1 定义proto文件1.2.2 编译proto文件1.2.3 编写客户端和服务端代码 2、gRPC的通信模式2.1 一元RPC模式2.2 客户端流RPC模式2.3 服务端流RPC模式2.4双向流RPC模式 3、 gRPC的底层原理探究3.1 H…

css列表

在CSS中&#xff0c;你可以使用样式规则来自定义HTML列表的外观。HTML中有两种常见的列表类型&#xff1a;无序列表&#xff08;<ul>&#xff09;和有序列表&#xff08;<ol>&#xff09;。可以用于自定义列表&#xff1a; 自定义无序列表&#xff08;无序列表符号…

P1433 吃奶酪

#include <iostream> #include <cmath> using namespace std; #define M 15 #define S(n) ((n) * (n)) double indx[M 5], indy[M 5], ans 0, sum 0;//坐标数组&#xff0c;从下标为1开始记录 int n, vis[M 5] { 0 };//vis数组&#xff0c;选过的数字标记为1…

关于pytorch不区分行向量与列向量的理解

听李沐老师讲深度学习时候解释pytorch不区分行向量和列向量&#xff0c;只相当于是一维数组&#xff0c;一维张量一定是行向量&#xff0c;相当于数组&#xff0c;而行列向量可以放到矩阵中看。 测试如下&#xff1a; rtorch.tensor([1,2,3],dtypetorch.float32) print(r,r.T…

滑动窗口算法(C语言描述)

第一种类型&#xff1a;不固定长窗口 问题1&#xff1a;*** C代码1&#xff1a; #include<stdio.h> #include<string.h> #define N 5int min_len(int len1,int len2) {return (len1 < len2 ? len1:len2); }int main() {int target 0;int num[N];scanf("…

C语言中的文件操作指南

阅读导航 前言一、文件类型1. 程序文件2. 数据文件PS.文件名 二、文件的打开和关闭1. 文件指针2. 文件的打开和关闭 三、文件的顺序读写四、文件的随机读写1. fseek() 函数2. ftell() 函数3. rewind() 函数 总结 前言 在C语言中&#xff0c;文件操作是一项重要的任务。通过文件…

阿里云在云原生领域喜获多项 OSCAR 开源尖峰案例奖

当前&#xff0c;国内开源技术正逐渐在各领域落地&#xff0c;越来越多的企业已经或准备使用开源&#xff0c;优秀的开源案例可以起到领航和参考作用。为了更好地推动开源技术在中国市场的落地&#xff0c;鼓励企业和厂商使用开源&#xff0c;鼓励企业或个人进一步探索我国开源…

矩阵系统能做什么

矩阵系统可以应用于许多领域&#xff0c;包括但不限于以下方面&#xff1a; 1. 工程领域&#xff1a;在工程项目中&#xff0c;矩阵系统可用于设计和优化结构、系统、网络、电路、热管理等。例如&#xff0c;矩阵系统可以用来分析和预测系统的稳定性、可靠性、响应时间、能耗等…

centos 磁盘挂载与解挂

磁盘挂载 查看已挂载的磁盘 df -TH查看磁盘分区&#xff0c;对比第一步&#xff0c;看哪些磁盘没有挂载&#xff0c;例如发现/dev/sdb的磁盘没有在第一步中显示 fdisk -l磁盘分区&#xff08;/dev/sdb为上一步骤中没有挂载的磁盘&#xff09; fdisk /dev/sdb执行上一命令后…

vue-cli + vue3 项目 ios 苹果手机白屏问题

目录 问题描述原因分析解决方案遇到的坑1&#xff0c;架构问题2&#xff0c;项目引入其他依赖的问题 参考 问题描述 vue-cli vue3 的项目&#xff0c;在苹果手机上打开白屏&#xff0c;安卓手机正常显示。 原因分析 1&#xff0c;借助 vconsole 发现并没有打印报错信息&…

2023年中国分布式光纤传感产量、需求量及行业市场规模分析[图]

分布式光纤传感器中的光纤能够集传感、传输功能于一体&#xff0c;能够完成在整条光纤长度上环境参量的空间、时间多维连续测量&#xff0c;具有结构简单、易于布设、性价比高、易实现长距离等独特优点&#xff0c;常用的分布式光纤传感器有光时域反射仪、布里渊分析仪、喇曼反…

Outlook导入导出功能灰色,怎么解决

下载安装 Outlook 软件后&#xff0c;登陆账号&#xff0c;然后选择“文件” - “导出”&#xff0c;结果发现“导出”按钮是灰色的&#xff0c;根本无法导出。根据官方说法&#xff1a;由于配置没有完成或者office产品没有正确激活。outlook导出键为灰色原因由于配置没有完成或…

生信教程:使用拓扑加权探索基因组进化(3)

使用 Twisst 探索整个基因组的进化关系的拓扑加权教程[1]。 简介 拓扑加权是量化不一定是单系群之间关系的一种方法。它通过考虑更简单的“分类单元拓扑”并量化与每个分类单元拓扑匹配的子树的比例&#xff0c;提供了复杂谱系的摘要。我们用来计算权重的方法称为 Twisst&#…