从std::promise直接获取与转换std::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
相关产品推荐
相关产品推荐

