std::async和std::future是C++11提供的异步任务协作工具,用于后台执行耗时操作并安全获取结果;前者启动任务并返回future,后者通过get/wait等接口访问结果,支持异常传递与超时等待,但仅限单次取值且不可拷贝。
它们一起帮你把一段耗时操作(比如文件读取、网络请求、复杂计算)扔到后台去跑,主线程不用干等着,还能继续干活;等需要结果时,再安全地取回来。核心思想是:**启动异步任务 + 后续获取结果(或等待完成)**。
它像一个启动器,调用后立刻返回一个 std::future 对象,而实际函数会在另一个线程(或延迟到 future.
get() 时才执行,取决于 launch 策略)运行。
auto fut = std::async(std::launch::async, []{ return 42; }); —— 明确要求新开线程立即执行std::launch::deferred,表示“先不执行,等你调 get() 或 wait() 时才同步执行”,类似懒加载
std::launch::async | std::launch::deferred,由系统决定——但实践中建议显式指定,避免意外同步行为它是 async 返回的句柄,是你和异步任务之间的唯一联系。它不保存数据本身,而是提供一套安全访问结果的接口:
fut.get():阻塞等待,拿到结果(int/void/exception),且只能调一次;第二次调会抛异常fut.wait():只等待完成,不取值,适合 void 类型任务fut.wait_for(...) 或 fut.wait_until(...):带超时的等待,避免无限卡住fut.valid():检查 future 是否关联有效任务(比如是否被 move 走过)假设你要并行算两个数的平方和阶乘:
#include#include int square(int x) { return x x; } int factorial(int n) { int res = 1; for (int i = 2; i <= n; ++i) res = i; return res; }
int main() { // 同时启动两个异步任务 auto f1 = std::async(std::launch::async, square, 10); auto f2 = std::async(std::launch::async, factorial, 5);
// 主线程可做其他事……比如打印提示 std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Tasks started, doing something else...\n"; // 等待并取结果(这里会阻塞直到两者都完成) int s = f1.get(); // 100 int f = f2.get(); // 120 std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Square: " zuojiankuohaophpcnzuojiankuohaophpcn s zuojiankuohaophpcnzuojiankuohaophpcn ", Factorial: " zuojiankuohaophpcnzuojiankuohaophpcn f zuojiankuohaophpcnzuojiankuohaophpcn "\n";}