当前位置: 首页 > 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.lryc.cn/news/456664.html

相关文章:

  • Chatgpt 原理解构
  • 【每日刷题】Day135
  • Linux运维01:VMware创建虚拟机
  • 服务器平均响应时间和数据包大小关系大吗?
  • Vue入门-指令学习-v-show和v-if
  • nacos多数据源插件介绍以及使用
  • 国庆档不太热,影视股“凉”了?
  • QtDesign预览的效果与程序运行的结果不一致的解决方法
  • 模运算和快速幂
  • 【机器学习】——神经网络与深度学习:从基础到应用
  • Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出
  • QT入门教程攻略 QT入门游戏设计:贪吃蛇实现 QT全攻略心得总结
  • Linux No space left on device分析和解决
  • Qt实现Halcon窗口显示当前图片坐标
  • 构建宠物咖啡馆:SpringBoot框架的实现策略
  • Qt开发环境的搭建
  • docker-compose查看容器日志和实时查看日志
  • MVC、MVP和MVVM之间的区别
  • uni-app 打包成app时 限制web-view大小
  • 智能指针(2)
  • [含文档+PPT+源码等]精品基于Nodejs实现的家教服务小程序的设计与实现
  • electron打包报错-winCodeSign无法下载
  • 给Windows系统设置代理的操作方法
  • 高质量带货短视频素材来源推荐
  • torchvision.transforms.Resize()的用法
  • 简单认识 redis -数据类型命令
  • Python 语言学习——应用1.2 数字图像处理(第二节,变换)
  • 【QT Quick】页面布局:手动定位与坐标系转换
  • uniapp自定义导航,全端兼容
  • [论文阅读] DVQA: Understanding Data Visualizations via Question Answering