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
这意味着运行时可以自行决定是异步执行还是延迟执行。编译器和运行环境根据负载、线程资源等情况动态选择最优方式。这种灵活性可能导致行为不一致,因此在需要明确并发行为时,建议显式指定策略。
基本上就这些。理解这两种策略的关键在于:一个是“马上开线程”,另一个是“等你来取结果时才执行”。根据性能需求和线程安全考虑选择合适的策略。









