std::future与std::promise是否为一对一关系?哪些场景会打破该关系?
你的理解基本正确: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

