当前位置: 首页 > news >正文

C++ 异步执行任务async()

前言

std::async是C++11新增的一个功能,它主要提供了一种方便的方式来执行异步任务。std::async函数模板会返回一个std::future对象,该对象表示异步任务的执行结果。

基本用法

函数原型

std::future<T> async( std::launch policy, Function f, Args... args );
  • std::launch policy:这是一个可选参数,用于指定异步任务的启动策略。它可以是std::launch::async(尽可能异步执行),std::launch::deferred(延迟执行,直到调用std::future::getstd::future::wait),或者两者的按位或组合。如果不指定,则使用std::launch::async | std::launch::deferred。在具体开发使用中,不建议使用组合,因为行为可能会出现与开发目的不同的结果。
  • Function f:要异步执行的函数或可调用对象。可以是函数指针、函数对象和lambda函数
  • Args... args:传递给函数的参数,这里是一个参数包。

返回值

std::async返回值是一个std::future对象
std::future是一个模板类:

tempalte<class T>
std::future<T>

数据类型T 取决于异步函数的返回值类型

使用示例

#include <iostream> 
#include <future> 
#include <chrono> 
int compute(int x) 
{ std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟耗时操作 return x * 2; 
} int main() 
{ // 启动异步任务 auto future = std::async(std::launch::async, compute, 42); // 获取异步操作的结果int result = future.get(); // 阻塞直到异步操作完成,并获取结果 std::cout << "The result is " << result << std::endl; 
return 0; 
}

注意事项

  • std::async异常抛出:如果异步任务抛出异常,该异常会被储存在返回值std::future对象中,只有调用get()时,才会在本线程抛出。
  • 返回值std::future对象应该使用std::move来移动std::future内的数据,而不是复制。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python画笔案例-032 绘制螺旋扇子
  • 共享变量与 `ThreadLocal` 的潜在问题
  • CVE-2023-0674 漏洞复现
  • Keil下载烧录程序到单片机提示flash outtime超时
  • [Docker]当下实测可用Docker镜像源
  • Mybatis链路分析:JDK动态代理和责任链模式的应用
  • 终于!有人总结了大模型学习资料!零基础入门到精通,收藏这一篇就够了
  • 目标跟踪算法——ByteTrack算法原理解析
  • MySQL唯一索引大小写敏感性问题及字符集深入解析
  • leetcode 902. Numbers At Most N Given Digit Set
  • 小程序获取自定义tabbar高度踩坑
  • MARK图像处理与计算机视觉基础,经典以及最近发展
  • C++:构造函数、析构函数
  • VTK平面切割
  • Spring 框架下 Redis 数据结构的全面解析
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [LeetCode] Wiggle Sort
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • ES6简单总结(搭配简单的讲解和小案例)
  • HashMap剖析之内部结构
  • java2019面试题北京
  • JavaScript设计模式系列一:工厂模式
  • Java方法详解
  • maven工程打包jar以及java jar命令的classpath使用
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Python利用正则抓取网页内容保存到本地
  • Python爬虫--- 1.3 BS4库的解析器
  • Vue.js 移动端适配之 vw 解决方案
  • webgl (原生)基础入门指南【一】
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 力扣(LeetCode)22
  • 如何胜任知名企业的商业数据分析师?
  • 数据科学 第 3 章 11 字符串处理
  • 小程序测试方案初探
  • 由插件封装引出的一丢丢思考
  • 原生Ajax
  • k8s使用glusterfs实现动态持久化存储
  • 通过调用文摘列表API获取文摘
  • ‌内网穿透技术‌总结
  • ###STL(标准模板库)
  • #宝哥教你#查看jquery绑定的事件函数
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C11) 泛型表达式
  • (Ruby)Ubuntu12.04安装Rails环境
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (回溯) LeetCode 40. 组合总和II
  • (六)vue-router+UI组件库
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (算法)求1到1亿间的质数或素数
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (原创)可支持最大高度的NestedScrollView
  • (转)关于pipe()的详细解析
  • (转)全文检索技术学习(三)——Lucene支持中文分词