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

std::future与std::promise是否为一对一关系?哪些场景会打破该关系?

std::promise 与 std::future 的关系解析

你的理解基本正确:std::promise 和 std::future 本质上是一对一绑定的关系,二者通过一个共享状态关联起来。std::promise 负责向共享状态写入结果(值或异常),而 std::future 则负责从该共享状态读取结果,一个 promise 只能对应一个 future,反之亦然。

会打破这一关系的场景

确实存在打破这种一对一绑定有效性的场景,其中你提到的 broken promise 是最典型的情况:

  • Broken Promise(失效承诺):当 std::promise 在未通过 set_value()、set_exception() 完成结果设置的情况下被销毁(例如超出作用域),或者主动调用 promise.set_exception(std::make_exception_ptr(std::future_error(std::future_errc::broken_promise))) 时,共享状态会进入失效(broken)状态。此时关联的 std::future 在调用 get()、wait() 等方法时会抛出 std::future_error(错误码为 broken_promise),这意味着原本的结果传递关系被彻底打破——promise 无法再提供预期的结果,future 也无法获取有效数据。

  • 重复操作 promise:如果 std::promise 已经完成了结果设置(调用过 set_value() 或 set_exception()),再次尝试设置结果会直接抛出 std::future_error(错误码为 promise_already_satisfied)。此时共享状态已经处于"就绪"状态,promise 与 future 的绑定关系虽然没有被"打破",但 promise 已经无法再对共享状态做任何有效操作,相当于绑定关系的使命已结束。

  • future 所有权转移:当 std::future 被移动(例如通过 std::move(future) 转移给另一个 future 对象),原 future 对象会失去对共享状态的关联,但这属于所有权转移,而非打破一对一关系——新的 future 仍与原 promise 保持一对一绑定,只是关联的对象变了。

总结

std::promise 和 std::future 的一对一绑定是核心设计,但这种关系的有效性可能被 broken promise、非法重复操作等场景破坏,其中 broken promise 是最直接的"关系打破"场景,会导致 future 无法获取有效结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:45:40