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-beforewakeThreadB(),也就是存储操作一定在唤醒线程B之前完成。 wakeThreadB()这类线程唤醒操作(无论底层是条件变量、信号量还是其他同步原语)必然携带同步语义,会确保线程A中所有在此之前完成的内存操作(包括x的存储)对线程B可见。- 所以线程B执行
x.load(std::memory_order_relaxed)时,必然能读取到42,断言不会触发。
内容的提问来源于stack exchange,提问作者emptysamurai
相关产品推荐
相关产品推荐

