< 返回版块

peacess 发表于 2022-02-16 12:09

Tags:atomic ordering thread

代码 let b = b_clone.load(Ordering::Relaxed); let a = a_clone.load(Ordering::Relaxed); 与 for i in 0..max_value { // fence(Ordering::SeqCst); a.store(i,Ordering::Relaxed); b.store(i, Ordering::Relaxed); } 它们之间是无序的,那么可能出 if b > a { println!("b is {}, a is {}", b, a); }的情况, 但是测试代码,从来没有出现过这种情况,无论运行多少次。请问有验证过可以的吗?

代码: https://gist.github.com/rust-play/0ca595b22ffba3f416cb88962ab5f51a

完整代码如下 :

use std::sync::{Arc, Barrier}; use std::sync::atomic::{AtomicUsize, Ordering}; use std::thread;

fn main(){ let thread_num = num_cpus::get() -2; let max_value = 10000; let a = Arc::new(AtomicUsize::new(0)); let b = Arc::new(AtomicUsize::new(0)); let barrier = Arc::new(Barrier::new(thread_num + 1));

let mut threads = vec![];

for _ in 0..thread_num {
    let a_clone = a.clone();
    let b_clone = b.clone();
    let barrier_clone = barrier.clone();
    let t = thread::spawn(move ||{
        barrier_clone.wait();
        let mut v = 0;
        while v < max_value -1 {
            // fence(Ordering::SeqCst);
            let b = b_clone.load(Ordering::Relaxed);
            let a = a_clone.load(Ordering::Relaxed);

            if b > a {
                println!("b is {}, a is {}", b, a);
            }
            v = a;
        }
    });
    threads.push(t);
}

barrier.wait();
for i in 0..max_value {
    // fence(Ordering::SeqCst);
    a.store(i,Ordering::Relaxed);
    b.store(i, Ordering::Relaxed);
}

for t in threads {
    let _= t.join();
}

}

评论区

写评论
HC97 2022-02-17 20:14

可以参考一下这篇文章 Memory Model: 从多处理器到高级语言

7sDream 2022-02-16 14:31

Memory ordering 的问题很复杂,涉及到从软件到硬件的各个级别。 代码里的 Relaxed-Ordering,语言规范可以要求只把它当作一个优化标识,表示你可以接受最宽松的 Memory ordering,而不是要求编译器真正使用这个 Ordering。 同理,编译器也可能在不同的情况下使用不同的 Ordering 的指令,只要不低于你要求的这个就行。 再次同理,CPU 也可以在指令集执行层面,就强制决定使用更高的 Ordering 来执行。

在使用 Memory ordering 参数的时候,永远认为自己指定的是「最低要求」就可以了,而具体表现,有可能因为各个方面的优化,而和你猜想的不一致。

比如你这里验证不出来,就非常可能是因为 X86 架构本身是 truly strict ordering 的。假设换一个环境,比如在某些内存序宽松的 ARM 芯片上执行,就能验证出重排的情况了。

songzhi 2022-02-16 13:40
作者 peacess 2022-02-16 12:55

有没有什么好的方法验证 Ordering::Relaxed的无序性

1 共 4 条评论, 1 页