std::future 异步取值
更新时间:2026-10-01。配合 07 并发,本文聚焦“提交任务、稍后取结果”。
一、三件套
async 启动、packaged_task 绑定任务与其 future、promise 最底层手动传值;结果或异常都通过 future 在 get() 处汇合。
二、陷阱
std::async 默认策略可能选择 deferred,不调用 get 永远不执行;future 析构对仅 async 创建的临时对象可能阻塞;异常在工作线程抛出,到 get() 才重抛;缺乏续体导致回调链难写(协程是现代替代,见 27)。

常见坑
- 忘记 get 导致 deferred 任务饿死。
- 多次 get 同一 future。
- 假定 async 一定开新线程。
小结
总结
std::future 是"提交任务、稍后取结果"的一次性结果通道:std::async 启动、packaged_task 把可调用对象绑定到 future、promise 在最底层手动 set_value,结果或工作线程抛出的异常都在 future.get() 处汇合重抛(get 只能调一次,需多次等待用 shared_future);关键陷阱是 async 默认启动策略可能选 deferred——不调用 get 任务永远不执行,且不能假定 async 一定新开线程;由于它没有 then 续体、不可组合,复杂异步链应考虑协程。