C++ 异步编程中:future与promise、packaged_task、async

news2024/9/23 18:53:47

原文链接:C++ 异步编程之future与promise、async、packaged_task_std::promise和std::future异步发送-CSDN博客

1、std::future
std::future类模板来关联线程运行的函数和函数的返回结果,这种获取结果的方式是异步的

std::future 通常由某个 Provider 创建,你可以把 Provider 想象成一个异步任务的提供者,
Provider 在某个线程中设置共享状态的值,与该共享状态相关联的 std::future 对象调用 get(通常在另外一个线程中) 获取该值,
如果共享状态的标志不为 ready,则调用 std::future::get 会阻塞当前的调用者,直到 Provider 设置了共享状态的值(此时共享状态的标志变为 ready),
std::future::get 返回异步任务的值或异常(如果发生了异常)。

2、std::promise
std::promise类型模板提供“设置异步结果”的方法,
这样其他线程就可以通过std::future实例来“读取”该结果。
std::promise和std::future合作共同实现了多线程间通信。

通过调用std::promise的get_future函数,可以将该共享状态与std::future对象关联。
调用get_future之后,两个对象共享相同的共享状态:
std::promise对象是异步提供程序(asynchronous provider),应在某个时刻为共享状态设置一个值。
std::future对象是个异步返回对象,可以检索共享状态的值,并在必要时等待其准备就绪。
 需要注意的是:set_value只能被调用一次,多次调用会抛出std::future_error异常。
事实上std::promise::set_xxx函数会改变std::promise的状态为ready,
再次调用时发现状态已是reday了,则抛出异常。


3、std::packaged_task
std::packaged_task是一个模板类,它允许传入一个函数或其他可调用对象,
并将函数计算的结果作为异步结果传递给std::future,包括函数运行时产生的异常。

4、c++11提供了异步接口std::async
c++11提供了异步接口std::async,通过这个异步接口可以很方便的获取线程函数的执行结果。
std::async会自动创建一个线程去调用线程函数,它返回一个std::future,这个future中存储了线程函数返回的结果

当有线程调用了这个future对象的wait()和get()成员函数,则该任务会同步运行;

std::async是一个函数而非类模板,其函数执行完后的返回值绑定给std::futrue对象;
async(launch policy, Callable&& func, Args&& ... args);
std::launch policy是启动策略,它控制std::async的异步行为,
我们可以用“3种不同的启动策略”来创建std::async:
    std::launch::async参数:保证异步行为,即传递函数将在单独的线程中执行;
    std::launch::deferred参数:当其他线程调用get()/wait()来访问共享状态时,将调用非异步行为;
    std::launch::async | std::launch::deferred参数:是默认行为(可省略)。有了这个启动策略,它可以异步运行或不运行,这取决于系统的负载。

std::async允许通过添加额外的调用参数,向函数传递额外的参数。
第一个参数是指向成员函数的指针,
第二个参数提供这个函数成员类的具体对象(是通过指针,也可以包装在std::ref中),剩余的参数可作为函数的参数传入。
    否则,第二个和随后的参数将作为函数的参数,或作为指定可调用对象的第一个参数。
auto f1= std::async(&X::foo,&x, 42, "hello");  // 调用p->foo(42, "hello"),p是指向x的指针
auto f2= std::async(&X::bar, x, "goodbye");  // 调用tmpx.bar("goodbye"), tmpx是x的拷贝副本
std::async 的返回值(std::future)在析构函数里会等待任务完成;
    
std::async意义:
    在已经有了td::future、std::promise和std::packaged_task的情况下,实现异步或多线程间通信,
可能觉得已经足够了,真的还要一个std::async来凑热闹吗??
=》
是std::async是为了让用户的少费点脑子的,它让这三个对象默契的工作。
大概的工作过程是这样的:std::async先将异步操作用std::packaged_task包装起来,
然后将异步操作的结果放到std::promise中,这个过程就是创造未来的过程。
外面再通过future.get/wait来获取这个未来的结果。
=》std::async真的是来帮忙的,你不用再想到底该怎么用std::future、std::promise和 std::packaged_task了,
std::async已经帮你搞定一切了!这就是我们前面说的,std::async类似封装了thread和packged_task的功能。
使得我们使用起来更加方便简单。

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

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

相关文章

BOE(京东方)携故宫博物院举办2024“照亮成长路”公益项目落地仪式以创新科技赋能教育可持续发展

2024年9月20日,BOE(京东方)“照亮成长路”智慧教室落成暨百堂故宫传统文化公益课山西活动落地仪式在山西省太原市娄烦县实验小学隆重举行。自“照亮成长路”教育公益项目正式设立以来,BOE(京东方)持续以创新…

食家巷苦豆粉,香得很哟

苦豆粉,它看似普通,却承载着西北的厚重历史与浓郁风情。那一抹淡淡的绿色粉末,蕴含着大自然的馈赠和西北人民的智慧。 苦豆,这种生长在西北土地上的植物,经过精心研磨,变成了细腻的苦豆粉。它的味道独特&am…

Kimi助你快速完成开题报告【超详细实操教程】

随着人工智能的飞速发展,AI技术已经渗透到我们生活的方方面面,包括学术研究。在接下来的文章中手把手教你如何利用AI工具来优化每一个部分,让你的开题报告不仅内容丰富,而且结构严谨,逻辑清晰,为你的毕业论…

01.前端面试题之ts:说说如何在Vue项目中应用TypeScript?

文章目录 一、前言二、使用Componentcomputed、data、methodspropswatchemit 三 、总结 一、前言 与link类似 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, 其是基于vue-class-component库而来,这个库vue官方推出…

通过 Flink 的火焰图定位反压

在 Apache Flink 中,Web UI 提供了丰富的监控工具来帮助用户分析和解决作业性能问题,其中火焰图(Flame Graph)是用于分析反压问题的一个强有力的工具。反压可能是由于作业中某些算子处理速度过慢,或者资源耗尽导致的。…

深度学习模型之BERT的24个小模型源码与预训练紧凑模型的重要性

原始信息 论文: Well-Read Students Learn Better: On the Importance of Pre-training Compact Models作者:Iulia Turc, Ming-Wei Chang, Kenton Lee, Kristina Toutanova地址:arxiv.org/pdf/1908.08…中文:阅读良好的学生学得更…

人工智能时代的学与教

疫情逐渐散去之后,最最吸引全球目光的应该就是ChatGPT-3了。美国政治家亨利基辛格领衔出版的新书《AI世代与我们人类的未来》(The Age of AI and Our Human Future)中举了一个例子来说明ChatGPT-3的能力。首先让ChatGPT-3阅读关于它自身能力的哲学评论之后&#xff…

【Go】Go语言中深拷贝和浅拷贝

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

windows自定义路径docker安装

环境: win11(win10也是同样流程) docker:Docker version 27.1.1, build 6312585 目录 1.下载docker 2.自定义路径安装 3.修改镜像保存路径 非win系统的同学可以参考:官方说明文档 1.下载docker docker官网下载链接 进入官网后选择对应的系统版本下载即可。 …

IDEA明明模块和环境变量配置的是JDK8但是显示别的版本解决方案

IDEA明明模块和环境变量配置的是JDK8但是显示别的版本解决方案 我目前系统中存在JDK8,JDK11,JDK17等多个版本,方便开发使用,但是有些时候也是比较烦人的,因为不同版本的JDK包有所区别。 需要注意的几个地方。方便自己排查一下。

Vue3:具名插槽

目录 一.性质与作用 1.基本性质 2.使用方式 3.作用 4.应用场景 5.注意事项 二.使用 1.父组件 2.子组件 三.代码 1.父组件代码 2.子组件代码 四.效果 具名插槽在Vue3中用于为组件提供一种方式,允许父组件向子组件注入内容,并且可以指定这些内…

硬盘数据能否自己在家恢复?探索数据恢复的可行性与方法

随着数字化时代的到来,硬盘作为我们存储大量重要数据的设备,其重要性不言而喻。然而,当硬盘出现问题,如误删除、硬盘损坏、病毒感染等,导致数据丢失时,我们往往会感到十分焦虑。那么,硬盘数据能…

阿里巴巴新推出Java版AI 应用开发框架-Spring AI Alibaba

[Spring AI Alibaba 是一款 Java 语言实现的 AI 应用开发框架,旨在简化 Java AI 应用程序开发,让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。Spring AI Alibaba 基于 Spring AI 开源项目构建,默认提供阿里云基础模型服务、开源…

【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现

题目 【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动…

杰发科技——Eclipse环境安装

文件已传到网盘: 1. 安装文件准备 2. 安装Make 默认路径:C:\Program Files (x86)\GnuWin32\bin\ 不复制的话会报错 Error: Program "make" not found in PATH 3. 安装工具链 默认路径:C:\Program Files (x86)\Arm GNU Toolchain…

阅读CVPR论文——mPLUG-Owl2:革命性的多模态大语言模型与模态协作

读后感悟: 1)实验部分非常丰富,并且论文中的图制作的非常精美,论文开篇的图制作的别出心裁,将几种不同的方法表现出的性能差异不是以普通的表格形式展现,而是制作成了一副环状折线图,论文中其他…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-19

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-19 1. SAM4MLLM: Enhance Multi-Modal Large Language Model for Referring Expression Segmentation Authors: Yi-Chia Chen, Wei-Hua Li, Cheng Sun, Yu-Chiang Frank Wang, Chu-Song Chen SAM4MLLM: 增强多模…

网络通信——NAT(网络地址转换)

一.NAT是什么 1.首先运营商维护的网络时公网的,使用的是公网的IP地址,而私有的IP地址的不能的在公网上路由,为了保证网络互通,所以有了NAT技术。 2.NAT一般部署在公网和私网上的网关设备上面。 二.为什么会这样 因为你只要出到…

CAD图纸防泄密如何实现?六个措施杜绝泄密风险!

在工程设计领域,CAD图纸作为企业的核心机密之一,其安全性直接关系到企业的技术优势和商业竞争力。 然而,随着信息技术的不断发展,CAD图纸的泄密风险也日益增加。 为了确保CAD图纸的安全,企业必须采取一系列有效的防泄…

ubuntu下使用qt编译QOCI(libqsqloci.so)驱动详解及测试

1、系统及软件版本:ubuntu16.04LTS 安装在WMare虚拟机上,qt的版本是QT5.12.11 2、下载编译libqsqloci.so驱动所需的oracle相关sdk包和basic包,我下载的是11.2.0.4版本,下载地址:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.htm…