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

std::async概念和使用方法

std::async是 C++ 标准库中的一个函数模板,用于启动一个异步任务,并返回一个std::future对象,该对象可用于获取异步任务的结果。

1、概念

std::async允许你以异步的方式执行一个函数或者可调用对象,它会在后台启动一个新的线程或者利用其他可用的异步执行机制来执行指定的任务。通过std::future对象,你可以在将来的某个时间点获取异步任务的结果,或者检查任务是否已经完成。

2、使用方法

  • 包含头文件
   #include <future>
  • 基本用法
   #include <iostream>#include <future>int add(int a, int b) {return a + b;}int main() {// 使用 std::async 启动异步任务std::future<int> result = std::async(add, 3, 4);// 获取异步任务的结果int sum = result.get();std::cout << "The sum is: " << sum << std::endl;return 0;}

在这个例子中,std::async(add, 3, 4)启动了一个异步任务来执行函数add(3, 4),并返回一个std::future<int>对象。然后,通过调用result.get()来获取异步任务的结果。如果异步任务还没有完成,result.get()会阻塞当前线程,直到任务完成并返回结果。

2.1 指定启动策略

  • std::async可以接受一个额外的参数来指定启动策略,有以下两种策略可选:

    • std::launch::async:强制异步启动,即一定会在单独的线程中执行任务。
    • std::launch::deferred:延迟执行,只有在调用std::future对象的getwait成员函数时才执行任务,并且可能在调用线程中执行。
   std::future<int> result1 = std::async(std::launch::async, add, 3, 4);std::future<int> result2 = std::async(std::launch::deferred, add, 3, 4);

2.2 异常处理

  • 如果异步任务抛出异常,调用std::future对象的get成员函数时会重新抛出该异常。
   #include <iostream>#include <future>int divide(int a, int b) {if (b == 0) {throw std::runtime_error("Division by zero");}return a / b;}int main() {std::future<int> result = std::async(divide, 10, 0);try {int quotient = result.get();std::cout << "The quotient is: " << quotient << std::endl;} catch (const std::exception& e) {std::cout << "Caught an exception: " << e.what() << std::endl;}return 0;}

std::async提供了一种方便的方式来执行异步任务并获取结果,但在使用时需要注意线程安全、资源管理和异常处理等问题。


http://www.mrgr.cn/news/46672.html

相关文章:

  • 深入解析 ZooKeeper:分布式协调服务的原理与应用
  • 青少年编程与数学 02-006 前端开发框架VUE 25课题、UI数据
  • WORD转PDF脚本文件
  • Django创建项目速成
  • RabbitMQ介绍与使用
  • linux-supervisor(进程控制系统)
  • 用包目录结构Python脚本,简陋而强大
  • 逼近理论及应用精解【9】
  • 大象机械臂myCobot 280 JN和D435i进行手眼标定
  • [nmap] 端口扫描工具的下载及详细安装使用过程(附有下载文件)
  • Matlab|基于遗传粒子群算法的无人机路径规划【遗传算法|基本粒子群|遗传粒子群三种方法对比】
  • 通过SE38编写一个报表
  • 线程安全-原子性,可见性,有序性
  • 保姆级教程 | 输出分子动力学轨迹文件输出特定原子范围内的化学环境
  • 可疑文件、文件夹、进程监控查杀脚本
  • k8s的安装和部署
  • 修改calibre-web最大文件上传值
  • Java第二阶段---12继承---第三节 final 修饰符
  • 询盘鸭跨境电商独立站
  • 软件设计师——系统基础开发
  • 【第2章 开始学习C++】C++语句
  • 力扣1031. 两个非重叠子数组的最大和
  • 体制内的必须要知道的“人情世故”及职场礼仪
  • 快速区分 GPT-3.5 与 GPT-4
  • 腾讯云SDK连麦应用
  • 高质量带货短视频素材来源推荐