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

使用C++11的`std::async`执行异步任务:实战指南

使用C++11的std::async执行异步任务:实战指南

在现代软件开发中,异步编程是提高应用程序性能和响应速度的重要手段。C++11引入了std::async,使得编写异步任务变得更加简单和直观。本文将详细介绍如何使用std::async执行异步任务,并提供完整的代码示例和详细的解释。

什么是std::async

std::async是C++11标准库中的一个函数模板,用于启动异步任务。它可以在后台线程中执行任务,并返回一个std::future对象,用于获取任务的结果。std::async的使用使得异步编程变得更加简单和直观,无需手动管理线程。

std::async的基本用法

std::async的基本用法如下:

#include <iostream>
#include <future>
#include <thread>
#include <chrono>// 一个简单的异步任务函数
int asyncTask(int x) {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作return x * x;
}int main() {// 使用std::async启动异步任务std::future<int> result = std::async(std::launch::async, asyncTask, 10);// 主线程可以继续执行其他操作std::cout << "Main thread is doing other work..." << std::endl;// 获取异步任务的结果int value = result.get();std::cout << "Result from async task: " << value << std::endl;return 0;
}

在这个示例中,std::async启动了一个异步任务asyncTask,并返回一个std::future<int>对象。主线程可以继续执行其他操作,直到需要获取异步任务的结果时,调用result.get()

std::async的启动策略

std::async的启动策略由第一个参数std::launch指定,有两种策略可选:

  1. std::launch::async:强制在新线程中异步执行任务。
  2. std::launch::deferred:延迟执行任务,直到调用std::future::getstd::future::wait时才执行。

可以同时指定多个策略,例如:

std::future<int> result = std::async(std::launch::async | std::launch::deferred, asyncTask, 10);
使用std::async的最佳实践
  1. 选择合适的启动策略:根据任务的特性选择合适的启动策略。如果任务是计算密集型的,建议使用std::launch::async;如果任务是I/O密集型的,可以考虑使用std::launch::deferred
  2. 处理异常:在异步任务中可能会抛出异常,需要在获取结果时处理这些异常。
  3. 避免资源竞争:在异步任务中访问共享资源时,需要使用互斥锁等同步机制,避免数据竞争。
代码示例:计算斐波那契数列

以下是一个使用std::async计算斐波那契数列的示例:

#include <iostream>
#include <future>
#include <vector>
#include <stdexcept>// 计算斐波那契数列的函数
int fibonacci(int n) {if (n < 0) {throw std::invalid_argument("Negative argument not allowed");}if (n == 0) return 0;if (n == 1) return 1;return fibonacci(n - 1) + fibonacci(n - 2);
}int main() {// 启动多个异步任务计算斐波那契数列std::vector<std::future<int>> futures;for (int i = 0; i < 10; ++i) {futures.push_back(std::async(std::launch::async, fibonacci, i));}// 获取异步任务的结果for (int i = 0; i < 10; ++i) {try {int result = futures[i].get();std::cout << "Fibonacci(" << i << ") = " << result << std::endl;} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;}}return 0;
}

在这个示例中,我们启动了多个异步任务来计算斐波那契数列,并使用std::future::get获取每个任务的结果。同时,我们在获取结果时处理了可能抛出的异常。

异步任务的取消

C++11标准库不直接支持异步任务的取消,但可以通过一些技巧实现。例如,可以使用一个共享的原子变量来指示任务是否应该取消:

#include <iostream>
#include <future>
#include <atomic>
#include <thread>
#include <chrono>// 一个带有取消功能的异步任务
void cancellableTask(std::atomic<bool>& cancelFlag) {for (int i = 0; i < 10; ++i) {if (cancelFlag.load()) {std::cout << "Task cancelled" << std::endl;return;}std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "Task running: " << i << std::endl;}std::cout << "Task completed" << std::endl;
}int main() {std::atomic<bool> cancelFlag(false);// 启动异步任务std::future<void> result = std::async(std::launch::async, cancellableTask, std::ref(cancelFlag));// 主线程等待5秒后取消任务std::this_thread::sleep_for(std::chrono::seconds(5));cancelFlag.store(true);// 等待任务完成result.get();return 0;
}

在这个示例中,我们使用一个共享的原子变量cancelFlag来指示任务是否应该取消。异步任务在每次迭代时检查这个标志,如果标志为true,则任务取消。

总结

std::async是C++11标准库中一个强大的工具,使得编写异步任务变得更加简单和直观。通过合理使用std::async,可以显著提高应用程序的性能和响应速度。本文详细介绍了std::async的基本用法、启动策略、最佳实践以及一些高级技巧,希望对你在实际开发中有所帮助。

如果你有任何问题或需要进一步的解释,欢迎在评论区留言。祝你在C++异步编程的学习和实践中取得好成绩!


希望这篇博文能帮助你理解如何使用C++11的std::async执行异步任务。如果有任何问题,随时告诉我!😊

相关文章:

使用C++11的`std::async`执行异步任务:实战指南

使用C11的std::async执行异步任务&#xff1a;实战指南 在现代软件开发中&#xff0c;异步编程是提高应用程序性能和响应速度的重要手段。C11引入了std::async&#xff0c;使得编写异步任务变得更加简单和直观。本文将详细介绍如何使用std::async执行异步任务&#xff0c;并提…...

【高阶数据结构】B树、B+树、B*树

B树、B树、B*树 1. 常见的搜索结构2. B树概念3. B树的插入分析4. B树的插入实现4.1 B树的节点设计4.2 B树的部分插入实现14.3 B树的查找4.4 B树的部分插入实现24.5 插入key的过程4.7 B树的插入完整代码4.8 B树的简单验证4.9 B树的删除4.10 B树的性能分析 5. B树6. B*树7. 总结8…...

HBuilderx中vue页面引用scss样式

scss为css样式的预编译器&#xff0c;引入了变量、嵌入、混合、集成、引入等功能&#xff0c;相对于css样式&#xff0c;实现了样式的编程&#xff0c;具有更灵活的样式编写模式。 那么在HBuilderx中&#xff0c;“.vue”格式页面如何调用scss样式呢&#xff1f;详细如下&#…...

粒子群算法原理的示例介绍

一&#xff1a;粒子群优化算法的介绍 粒子群优化算法&#xff08;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;于1995年提出。它受到鸟群狩猎行为的启发&#xff0c;通过模拟鸟群或鱼群的社会行为来进行问题的求解。 基本原理 粒子群算法中&#xff0c;每个解决…...

GNU/Linux - Open函数使用的O_CLOEXEC flag

在 Linux 中&#xff0c;“O_CLOEXEC ”标志与 “open ”系统调用一起使用&#xff0c;用于指定在使用 “exec ”系列函数&#xff08;如 “execve”、“execl ”等&#xff09;执行新程序时&#xff0c;“open ”返回的文件描述符应自动关闭。 In Linux, the O_CLOEXEC flag i…...

AWQ量化(Activation-aware Weight Quantization)

论文&#xff1a; AWQ: Activation-aware Weight Quantization for On-Device LLM Compression and Acceleration 中文解读&#xff1a; 深入理解AWQ量化技术 - 知乎 (zhihu.com) 动机&#xff1a;端侧设备用LLM&#xff0c;为了减少显存占用量&#xff0c;所以要用INT4量化&am…...

SprinBoot+Vue体育商品推荐的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…...

【Python基础】Python函数

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、函数的定义与调用三、函数参数3.1 位置参数3.2 默认参数3.3 可变数量参数&#xff08;或不定长参数…...

【超简单】1分钟解决ppt全文字体一键设置

省流 ppt的全部字体需要在“幻灯片母版”里面&#xff0c;“自定义字体”去设置好标题与正文的字体之后才算全部设置完毕 “视图”---“幻灯片母版” 找到“字体”---“自定义字体” 设置好中文和西文的字体&#xff0c;都可以按照自己的选择来&#xff0c;保存即可 吐槽 之…...

数组与贪心算法——179、56、57、228(2简2中)

179. 最大数&#xff08;简单&#xff09; 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 解法一、自定义比较…...

WireShark过滤器

文章目录 一、WireShark过滤器概念1. 捕获过滤器&#xff08;Capture Filters&#xff09;2. 显示过滤器&#xff08;Display Filters&#xff09;3. 捕获过滤器与显示过滤器的区别4. 过滤器语法结构实际应用场景 二、WireShark捕获数据包列表1. **No.&#xff08;序号&#xf…...

2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件

# 2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件 前提按照之前的步骤打开deepfacelive正确配置并且在窗口已经输出了换脸后的视频&#xff0c;不懂步骤可以移步 https://doc.youyacao.com/88/2225 ## 首先下载obs并配置 https://obsproject.com/ 通过…...

告别懵逼——前端项目调试与问题排查方法小结

在日常工作中&#xff0c;我们常常会遇到以下两类典型的挑战&#xff1a; 场景一&#xff1a; 接手无文档的老项目 1、情景描述&#xff1a; 你接手了一个历史久远的项目&#xff0c;项目文档缺失&#xff0c;前任开发者已经离开&#xff0c;而你对当前的业务逻辑和代码结构都…...

[数据集][目标检测]肺炎检测数据集VOC+YOLO格式4983张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4983 标注数量(xml文件个数)&#xff1a;4983 标注数量(txt文件个数)&#xff1a;4983 标注…...

顶层const和底层const

在C中&#xff0c;const修饰符用于声明常量&#xff0c;有两种常见的形式&#xff1a;顶层const和底层const&#xff0c;它们之间的区别在于它们修饰的对象及其在不同场景中的作用。 1. 顶层const (Top-level const) 顶层const用于修饰变量本身&#xff0c;使其成为常量。这意…...

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建 首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件…...

锡林郭勒奶酪品牌呼和浩特市大召店盛大开业

礼献中秋&#xff0c;香飘乳都。为进一步拓展锡林郭勒奶酪区域公用品牌产品销售渠道&#xff0c;9月8日&#xff0c;锡林郭勒奶酪区域公用品牌大召店在呼和浩特市大召广场月明楼隆重开业&#xff0c;现场为第三批新授权的39家奶酪生产经营主体代表授牌。至此&#xff0c;锡林郭…...

【Java算法】模拟

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 &#x1f9e3; 一.模拟算法 模拟算法和传统的算法有一些不同之处&#xff0c;更多的是对题目要求的理解&#xff0c;通过代码的方式去模拟实现一道题目在现实中的实现方法…...

标准库标头 <filesystem> (C++17)学习之文件类型

本篇介绍filesystem文件库的文件类型API。 文件类型 is_block_file (C17) 检查给定的路径是否表示块设备 (函数) is_character_file (C17) 检查给定的路径是否表示字符设备 (函数) is_directory (C17) 检查给定的路径是否表示一个目录 (函数) is_empty (C17) 检查给定的路径是…...

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…...

mysql笔记4(数据类型)

数据库的数据类型应该是数据库架构师(DBA)和产品经理沟通后依据公司的项目、业务而定的&#xff0c;而且会不停地变化。数据类型的选择方面没有一个统一的标准&#xff0c;但是应该符合业务、项目的逻辑标准。 菜鸟教程 Mysql 数据类型 文章目录 1. int类型2. 浮点数3. 定点数4…...

电脑开机出现no operation system found错误原因分析及解决方法

最近有网友问我电脑一启动提示&#xff1a;no operation system found&#xff0c;这个提示意思是未找到操作系统。并且出现bios能认别硬盘&#xff0c;快捷启动时找不到硬盘&#xff0c;出现该提示的原因有很多&#xff0c;下面我们来详细分析一下开机出现no operation system…...

数学建模笔记—— 主成分分析(PCA)

数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…...

@vueup/vue-quill使用quill-better-table报moduleClass is not a constructor

quill官方中文文档&#xff1a;https://www.kancloud.cn/liuwave/quill/1434144 扩展表格的使用 注意&#xff1a;想要使用表格 quill的版本要是2.0以后 升级到这个版本后 其他一些插件就注册不了了。 安装&#xff1a; npm install quilllatest 版本需要大于2.0版本 npm…...

gpp.bat,g++编译C++源文件的批处理

今天编写一个gpp.bat文件&#xff0c;是专门编译C源文件的批处理&#xff0c;内容如下&#xff1a; g %1.cpp -o %1.exegpp.bat的文件路径&#xff1a;D:\YcjWork\CppTour\gpp.bat 使用方法&#xff0c;在CMD下运行(//两个斜杠后面的内容是注释)&#xff1a; //运行gpp.bat&…...

JDBC:连接数据库

文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址&#xff0c;就是要重写toString()方法&#xff0c;但是我现在还不知道怎么写 修改完的代码&#xff0c;但是数据库显示&#…...

【赵渝强老师】大数据主从架构的单点故障

大数据体系架构中的核心组件都是主从架构&#xff0c;即&#xff1a;存在一个主节点和多个从节点&#xff0c;从而组成一个分布式环境。下图为展示了大数据体系中主从架构的相关组件。   视频讲解如下&#xff1a; 大数据主从架构的单点故障 【赵渝强老师】大数据主从架构的…...

【AutoX.js】选择器 UiSelector

文章目录 原文&#xff1a;https://blog.c12th.cn/archives/37.html选择器 UiSelector笔记直接分析层次分析代码分析 最后 原文&#xff1a;https://blog.c12th.cn/archives/37.html 选择器 UiSelector 笔记 AutoX.js UiSelector 直接分析 用于简单、最直接的查找控件 开启悬…...

Elasticsearch数据写入过程

1. 写入请求 当一个写入请求&#xff08;如 Index、Update 或 Delete 请求&#xff09;通过REST API发送到Elasticsearch时&#xff0c;通常包含一个文档的内容&#xff0c;以及该文档的索引和ID。 2. 请求路由 协调节点&#xff1a;首先&#xff0c;请求会到达一个协调节点…...

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…...