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

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.kler.cn/news/340672.html

相关文章:

  • 【JavaSE系列】网络编程
  • 【智能算法应用】正切搜索算法求解二维路径规划问题
  • SQL注入靶场sqli-labs less-4
  • HashMap如何put一个数值
  • 【算法笔记】双指针算法深度剖析
  • 喜马拉雅FM车机版 2.0 | 车载音频利器,免登录无广告
  • REINFORCEMENT LEARNING THROUGH ACTIVE INFERENCE
  • 【python 简易入门应用教程】第二部分:数据处理与分析
  • ROS2初级面试题总结
  • 每天一道面试题(8):垃圾收集器GC中的Humongous Regions是什么??
  • Coggle数据科学 | 全球AI攻防挑战赛:金融场景凭证篡改检测 baseline
  • 晶体管最佳效率区域随频率逆时针旋转原因分析
  • express 中环境变量配置
  • 手撕SwiGLU和GELU
  • 基于依赖注入技术的.net core WebApi框架创建实例
  • 前端开发中的高级技巧与最佳实践
  • 天气API接口调用
  • 【树形DP】AT_dp_p Independent Set 题解
  • yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】
  • 【2024】前端学习笔记11-网页布局-弹性布局flex