在 fetch_add 上放宽内存排序

问题描述 投票:0回答:1

我正在阅读 Mara 的《原子和锁》一书,其中显示了这个示例代码,其中假设函数 a 和 b 是同时执行的:

static X: AtomicI32 = AtomicI32::new(0);

fn a() {
    X.fetch_add(5, Relaxed);
    X.fetch_add(10, Relaxed);
}

fn b() {
    let a = X.load(Relaxed);
    let b = X.load(Relaxed);
    let c = X.load(Relaxed);
    let d = X.load(Relaxed);
    println!("{a} {b} {c} {d}");
}

参考:https://marabos.nl/atomics/memory-ordering.html#relaxed

它表示,由于只有一个线程修改

X
,因此 X 的修改顺序只有一种可能:0 -> 5 -> 15

我的问题是为什么不能是这样的:0 -> 10 -> 15,因为指令可能会重新排序?我问这个是因为在本章前面已经指定了:

验证特定重新排序或其他优化不会影响程序行为的逻辑不考虑其他线程。

因此,我相信编译器或处理器可以根据需要自由优化和重新排序。

rust atomic memory-barriers instruction-reordering
1个回答
0
投票

重新排序,重新排序:)

单个原子值上的原子指令始终有序,无论使用的内存顺序如何。

内存排序仅影响相对于原子操作的

other值(原子或非原子)的内存操作顺序。

© www.soinside.com 2019 - 2024. All rights reserved.