std::async用于异步执行任务并返回future对象,可指定launch::async或launch::deferred策略,自动管理线程生命周期,支持异常捕获与处理,需注意及时调用get()避免阻塞,合理使用以提升异步编程效率。

在C++11及以后的标准中,std::async 是一个非常方便的工具,用于异步执行任务。它能自动管理线程的创建与生命周期,并返回一个 std::future 对象,用来获取异步任务的结果或状态。
基本用法:启动异步任务
使用 std::async 只需传入一个可调用对象(如函数、lambda表达式等),它会返回一个 std::future,通过调用其 get() 方法可以等待结果并获取返回值。
示例:
#include
#include
#include
int longRunningTask() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
}
int main() {
// 启动异步任务
auto future = std::async(longRunningTask);
std::cout << "任务正在执行中...\n";
// 等待结果
int result = future.get();
std::cout << "任务完成,结果是: " << result << "\n";
return 0;
}
立即学习“C++免费学习笔记(深入)”;
选择执行策略:launch::async 与 launch::deferred
std::async 支持指定启动策略:
- std::launch::async:强制在新线程中立即执行任务。
- std::launch::deferred:延迟执行,直到调用 get() 或 wait() 时才在当前线程同步运行。
- 默认情况下,系统可自由选择任一方式。
示例:强制异步执行
auto future = std::async(std::launch::async, [] {
return std::this_thread::get_id();
});
这样确保任务在独立线程中运行,避免意外的同步延迟。
获取异常与错误处理
异步任务中抛出的异常会被捕获并存储,当调用 future.get() 时重新抛出。
示例:
auto future = std::async([] {
throw std::runtime_error("出错了!");
});
try {
future.get();
} catch (const std::exception& e) {
std::cout << "捕获异常: " << e.what() << "\n";
}
这使得跨线程异常处理变得安全且可控。
注意事项与最佳实践
- 如果不需要返回值,仍可使用 std::async 执行后台操作,但建议考虑 std::thread 或线程池以减少开销。
- 未调用 get() 或 wait() 的 future 在析构时可能会阻塞主线程(特别是使用 deferred 策略时)。
- 避免长时间持有 future 而不检查结果,可能导致资源延迟释放。
- 多个 std::async 调用可能创建多个线程,注意系统资源限制。
基本上就这些。合理使用 std::async 可以简化异步编程,让代码更清晰、安全。关键是理解执行策略和结果获取机制,避免隐式阻塞或资源浪费。










