std::launch::async强制异步执行,立即创建新线程运行任务,并发不阻塞主线程;std::launch::deferred延迟执行,仅当future调用get或wait时才在调用者线程同步执行任务。

在C++中,std::async 是一个用于异步启动任务的函数模板,它返回一个 std::future 对象,用来获取异步操作的结果。std::async 接受一个启动策略(launch policy)来控制任务的执行方式。最常见的两种策略是 std::launch::async 和 std::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 的默认启动模式是:
立即学习“C++免费学习笔记(深入)”;
std::launch::async | std::launch::deferred
这意味着运行时可以自行决定是异步执行还是延迟执行。编译器和运行环境根据负载、线程资源等情况动态选择最优方式。这种灵活性可能导致行为不一致,因此在需要明确并发行为时,建议显式指定策略。
基本上就这些。理解这两种策略的关键在于:一个是“马上开线程”,另一个是“等你来取结果时才执行”。根据性能需求和线程安全考虑选择合适的策略。
以上就是C++的std::async策略是什么_C++中std::launch::async和std::launch::deferred的区别的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487992.html
微信扫一扫
支付宝扫一扫