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

std::memory_order_seq_cst存储后,relaxed加载是否保证读取写入值?

C++原子内存顺序问题解答

1. std::memory_order_seq_cst存储操作能否保证memory_order_relaxed加载读到写入值?

不能直接保证。std::memory_order_seq_cst的存储只是在全局同步序列中占据一个位置,但memory_order_relaxed的加载没有任何同步义务——它不要求和其他线程的操作建立happens-before关系,也不会主动同步其他线程的内存更新。如果没有额外的同步机制,relaxed加载有可能看不到seq_cst存储的值。

2. 示例代码中的x_value是否被C++标准保证为42?

是的,这个行为是标准保证的,核心原因在于wakeThreadB()带来的同步:

  • 在线程A内部,程序顺序规则保证x.store(42, std::memory_order_seq_cst) happens-before wakeThreadB(),也就是存储操作一定在唤醒线程B之前完成。
  • wakeThreadB()这类线程唤醒操作(无论底层是条件变量、信号量还是其他同步原语)必然携带同步语义,会确保线程A中所有在此之前完成的内存操作(包括x的存储)对线程B可见。
  • 所以线程B执行x.load(std::memory_order_relaxed)时,必然能读取到42,断言不会触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:45:58