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

当因wait_for超时导致std::future超出作用域后调用std::promise::set_value是否会触发未定义行为?

std::future超时销毁后调用std::promise::set_value的行为分析

嘿,这个问题问得很细致,我来帮你拆解清楚这个场景的行为:

首先可以明确地告诉你:这种情况完全不属于未定义行为,是C++标准允许的合法操作。

核心原理说明

  • std::promise 和 std::future 是一对关联的同步对象,但它们的生命周期彼此独立。一个 std::promise 对象只能通过 get_future() 生成一个关联的 std::future(多次调用会抛出 std::future_error),但当这个 std::future 被销毁后,std::promise 本身仍然处于有效状态。
  • 当你调用 promise.set_value() 时,不管是否还有关联的 std::future 存在,这个操作都是合法的:
    • 如果此时还有等待中的 future,它们会被唤醒并获取到值;
    • 如果所有关联的 future 已经被销毁(比如你的示例中因超时后超出作用域被销毁),promise 会正常进入就绪状态,但不会有任何等待的对象被唤醒——相当于你“发布”了一个值,但没有接收方,这完全符合标准规定。

结合你的示例代码分析

在你的代码里:

  1. futureThread 线程中的 std::future<void> future 超时后,函数执行完毕,这个 future 对象被销毁,它和 promise 的关联也就解除了;
  2. 主线程等待750ms后调用 promise.set_value(),此时已经没有任何 future 在等待这个值,但这个调用是完全安全的,程序不会崩溃,也不会触发未定义行为;
  3. 整个程序会正常运行到结束,不会出现任何异常情况。

总结一下:std::promise 的 set_value() 操作只要是在其生命周期内调用(即 promise 未被销毁),并且没有被重复调用(重复调用会抛出 std::future_error),就是合法的,和是否还有关联的 future 存在无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:52:31