首页 > 后端开发 > C++ > 正文

C++的std::async策略是什么_C++中std::launch::async和std::launch::deferred的区别

裘德小鎮的故事
发布: 2025-12-05 16:03:47
原创
287人浏览过
std::launch::async强制异步执行,立即创建新线程运行任务,并发不阻塞主线程;std::launch::deferred延迟执行,仅当future调用get或wait时才在调用者线程同步执行任务。

c++的std::async策略是什么_c++中std::launch::async和std::launch::deferred的区别

在C++中,std::async 是一个用于异步启动任务的函数模板,它返回一个 std::future 对象,用来获取异步操作的结果。std::async 接受一个启动策略(launch policy)来控制任务的执行方式。最常见的两种策略是 std::launch::asyncstd::launch::deferred,它们决定了任务何时以及如何运行。

std::launch::async:强制异步执行

使用该策略时,std::async 会立即创建一个新的线程来执行任务,保证任务在后台并发运行。

  • 任务会在独立的线程中执行,与调用者线程并行。
  • 即使系统资源紧张,也尝试启动新线程(若无法创建线程则抛出异常)。
  • 适用于需要真正并发、不希望阻塞主线程的场景。
  • 一旦 future 调用 get() 或 wait(),主线程会等待该异步线程完成。
例如:
auto future = std::async(std::launch::async, []() {
    return do_something();
});
// 此时新线程已经开始运行
int result = future.get(); // 等待结果
登录后复制

std::launch::deferred:延迟执行(惰性求值)

使用该策略时,任务,也不会创建新线程。任务的执行被推迟到 future 显式调用 get()wait() 的那一刻,并且是在调用者的线程中同步执行。

  • 没有额外线程开销,适合轻量或可能不需要执行的任务。
  • 任务只在需要结果时才运行,属于“懒加载”机制。
  • 如果 never 调用 get()/wait(),任务永远不会执行。
  • 不会并发,只是把函数调用延迟了。
例如:
auto future = std::async(std::launch::deferred, []() {
    return do_something();
});
// 此时 do_something 尚未运行

int result = future.get(); // 在这里同步执行
登录后复制

默认行为:由系统选择

如果不显式指定策略,std::async 的默认启动模式是:

Docky AI
Docky AI

多合一AI浏览器助手,解答问题、绘制图片、阅读文档、强化搜索结果、辅助创作

Docky AI 87
查看详情 Docky AI

立即学习C++免费学习笔记(深入)”;

std::launch::async | std::launch::deferred
登录后复制

这意味着运行时可以自行决定是异步执行还是延迟执行。编译器和运行环境根据负载、线程资源等情况动态选择最优方式。这种灵活性可能导致行为不一致,因此在需要明确并发行为时,建议显式指定策略。

基本上就这些。理解这两种策略的关键在于:一个是“马上开线程”,另一个是“等你来取结果时才执行”。根据性能需求和线程安全考虑选择合适的策略。

以上就是C++的std::async策略是什么_C++中std::launch::async和std::launch::deferred区别的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号