通八洲科技

C++如何使用std::async进行异步编程?(future用法)

日期:2026-01-01 00:00 / 作者:尼克
必须通过std::future的get()或wait()获取结果或等待完成,否则可能阻塞析构;支持async、deferred及二者组合策略,future为单次使用,异常被捕获并重抛,shared_future允许多次读取。

std::async 启动异步任务后,必须通过 std::future 获取结果或等待完成;不调用 get()wait() 可能导致线程资源未释放、程序阻塞在析构时。

std::async 的三种启动策略

std::async 支持三种 std::launch 策略,决定任务何时执行:

显式指定策略更可控。例如:auto f = std::async(std::launch::async, []{ return 42; });

future 的核心操作:get() 与 wait()

std::future 是单次使用的同步原语,关键行为如下:

注意:即使任务已结束,get() 仍会移动内部存储的值或异常,之后 future 处于无效状态。

处理异常和共享状态

异步函数内抛出的异常不会崩溃程序,而是被捕获并存入 future 中:

示例:auto sf = f.share(); auto a = sf.get(); auto b = sf.get(); // 合法

生命周期管理要点

std::future 析构时,若关联的异步任务仍在运行且策略为 async,析构会阻塞直到任务完成——这是常见陷阱:

真正“fire-and-forget”应配合 std::thread + 分离,或封装成不返回 future 的接口。