原子swap操作Acquire顺序下store为Relaxed的等价性及SeqCst疑问
Atomic swap 内存顺序的疑问解答
你的Acquire顺序理解是否正确?
完全正确。当swap指定Ordering::Acquire时,操作内部的load行为遵循Acquire语义(保证后续所有非原子/非Relaxed的内存操作不会被重排到这个load之前),而store行为则降级为Relaxed语义——这意味着这个store不施加任何内存屏障约束,编译器或CPU可以自由地将它和后续的普通操作(比如示例中的print!("hello"))调整执行顺序,也就是你最后给出的重排代码是完全合法的。
SeqCst顺序下的swap是否会被拆分?
不会。SeqCst是最严格的内存顺序,使用该顺序的swap是一个不可拆分的原子整体:
- 内部的load和store会被绑定为一个原子操作,不会被其他线程的操作交错插入;
- 整个swap操作会附带全内存屏障,禁止该操作与前后的任何内存操作发生重排,同时保证所有线程观察到的该操作的全局顺序一致。
内容的提问来源于stack exchange,提问作者navneet
相关产品推荐
相关产品推荐

