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

销毁已就绪状态的std::promise是否具有C++标准定义的行为?

这段C++代码的合法性分析

首先明确结论:这段代码是符合C++标准的合法代码,不存在未定义行为。

核心依据:标准中的同步规则

根据C标准(C11及后续版本),std::promise::set_value()的执行完成,会与所有等待对应std::future的操作(如get())的完成同步。这意味着:

  • 当主线程从promise.get_future().get()返回时,异步线程中set_value()的所有执行步骤已经全部完成,其所有副作用对主线程可见。
  • set_value()的完成会"happens before"(先于)future.get()的完成,两者之间不存在执行重叠的可能。

代码执行流程拆解

  1. 主线程创建std::promise<void>对象,调用startWorkAndCallBackFromDifferentThread启动异步任务,随后调用future.get()进入等待状态。
  2. 异步任务完成后,在独立线程中执行传入的lambda表达式:调用promise.set_value()。这个调用是同步执行的——只有当set_value()完成所有操作(包括原子标记共享状态为就绪、通知所有等待线程等)后,lambda才会退出。
  3. 主线程的future.get()会等待共享状态就绪,但根据标准的同步规则,get()的返回必须等待set_value()完全完成。因此,当主线程从get()返回时,异步线程已经完成了set_value()的调用,不会再访问promise对象。
  4. 主线程随后销毁promise对象,此时该对象已无其他线程访问,完全安全。

对担忧的澄清

你担心future.get()可能在set_value()执行完毕前返回,导致promise析构时set_value()仍在运行——这种情况在标准定义中是不可能发生的。set_value()与future.get()的强同步关系确保了get()的返回一定晚于set_value()的完成,因此promise的析构不会与set_value()的执行重叠。

你的实践中代码运行正常并非偶然,这是符合C++标准规定的确定行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:07:15