c++中如何使用std::async实现简单的并发任务_c++异步编程【实例】
发布时间 - 2026-01-31 00:00:00 点击率:次必须显式指定 std::launch::async 才真正并发;未取值的 future 析构会触发 std::terminate;捕获局部变量需确保生命周期安全,推荐值捕获或 shared_ptr。
直接用 std::async 启动一个异步任务,最简方式就是调用它并获取 std::future,但默认启动策略(std::launch::deferred 或 std::launch::async)不明确,容易误以为“已并发执行”,结果

必须显式指定 std::launch::async 才真正并发
如果不传启动策略,std::async 可能选择 deferred:函数体直到调用 get() 或 wait() 时才执行,且在调用线程中同步运行,根本没开新线程。
- 永远显式写
std::async(std::launch::async, ...)来确保立即派生线程 -
std::launch::deferred | std::launch::async是合法组合,但行为由实现决定,不可靠 - C++20 起,
std::launch::async是唯一能保证异步执行的策略
获取返回值前必须处理异常或调用 get()
std::future 析构时若未取值,且异步任务抛出异常,则程序会调用 std::terminate——不是崩溃,是直接终止,无堆栈、无提示。
- 务必在
future生命周期内调用get()(哪怕只读一次) - 若不关心返回值,可用
wait()等待完成,但依然要确保异常被传播出来(get()会重新抛出) - 推荐用
try-catch包裹get(),尤其当异步函数可能失败时
多个 std::async 任务需注意资源竞争与生命周期
每个 std::async 默认使用系统线程池(具体实现依赖标准库),但线程数不受控;同时捕获局部变量时,若异步任务生命周期超过变量作用域,就会悬垂引用。
立即学习“C++免费学习笔记(深入)”;
- 避免按值捕获大对象,优先用
std::move或共享指针(如std::shared_ptr) - 不要在 lambda 中直接捕获局部栈变量的引用(
[&]),除非能 100% 确保其存活到任务结束 - 大量任务建议改用线程池(如
boost::asio::thread_pool或自建),std::async不适合高吞吐调度
int main() {
// 正确:显式 async,捕获值,安全等待
auto fut1 = std::async(std::launch::async, []{ return 42; });
auto fut2 = std::async(std::launch::async, []{
std::this_thread::sleep_for(100ms);
return 100;
});
// 必须 get(),否则析构时异常导致 terminate
try {
int a = fut1.get(); // 阻塞直到完成
int b = fut2.get();
std::cout << a + b << "\n"; // 输出 142
} catch (const std::exception& e) {
std::cerr << "Async task failed: " << e.what() << "\n";
}
}
真正麻烦的从来不是怎么写那几行 std::async,而是谁来管理线程生命周期、异常怎么透出、结果怎么聚合、任务失败后要不要重试——这些 std::async 一概不管,得你自己兜底。
# 栈
# ai
# c++
# 异步任务
# 作用域
# 标准库
# red
# try
# catch
# 局部变量
# int
# 变量作用域
# Lambda
# 指针
# 堆
# 线程
# 线程生命周期
# 并发
# 对象
# 异步
# 抛出
# 返回值
# 这是
# 就会
# 多个
# 最多
# 是怎么
# 你自己
# 不适合
# 谁来
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
如何彻底卸载建站之星软件?
Laravel如何创建自定义Facades?(详细步骤)
android nfc常用标签读取总结
如何在Tomcat中配置并部署网站项目?
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
js实现点击每个li节点,都弹出其文本值及修改
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何用PHP快速搭建高效网站?分步指南
高防服务器租用如何选择配置与防御等级?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel PHP版本要求一览_Laravel各版本环境要求对照
怎么用AI帮你设计一套个性化的手机App图标?
简历在线制作网站免费版,如何创建个人简历?
微信小程序 配置文件详细介绍
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
高防服务器租用指南:配置选择与快速部署攻略
Laravel如何使用模型观察者?(Observer代码示例)
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
清除minerd进程的简单方法
实例解析angularjs的filter过滤器
如何用景安虚拟主机手机版绑定域名建站?
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
如何在Windows 2008云服务器安全搭建网站?
WEB开发之注册页面验证码倒计时代码的实现
php结合redis实现高并发下的抢购、秒杀功能的实例
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何在Windows环境下新建FTP站点并设置权限?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel如何实现模型的全局作用域?(Global Scope示例)
如何在 React 中条件性地遍历数组并渲染元素
如何在云服务器上快速搭建个人网站?
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何快速搭建虚拟主机网站?新手必看指南
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
如何注册花生壳免费域名并搭建个人网站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全

