You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从std::promise直接获取与转换std::future得到std::shared_future的差异

std::shared_future的两种获取方式:差异与场景推荐

这两种获取std::shared_future的方式,核心功能与行为完全等价,但在代码写法和适用场景上有细微区别,具体分析如下:

功能与行为差异

  • 最终效果一致:两种方式得到的std::shared_future都关联到同一个promise的共享状态,支持多线程同时等待、获取结果,不会像std::future那样在转移所有权后失效。
  • 表层区别:方法2会生成一个临时的std::future对象,调用share()后这个临时future会进入无效状态——后续再对它调用get()、wait()等方法会触发未定义行为。而方法1直接跳过了这个中间无效对象的环节。

性能差异

  • 理论上方法1略优:少了一次std::future的构造与所有权转移操作,但这种差异极其微小——std::future和std::shared_future的所有权转移本质是引用计数或指针的操作,编译器优化后两者的性能表现几乎无差别。
  • 实际应用中无需纠结:除非是极端高频的future创建场景(如每秒百万级以上),否则这点性能差异不会对程序产生影响。

场景推荐

  • 直接需要shared_future时选方法1:代码更简洁,避免引入可能被误用的无效std::future变量,可读性更好。
  • 需要先使用std::future处理逻辑时选方法2:比如要先调用wait_for()检查状态、或者需要暂时持有独占式的future(防止其他线程提前获取结果),这时只能先获取std::future,再通过share()转为shared_future。

注意:std::promise的get_future()只能调用一次,无论获取的是std::future还是std::shared_future,重复调用都会触发std::future_error异常。

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:44:57