use std::sync::atomic::{AtomicI32, Ordering};
static AT: AtomicI32 = AtomicI32::new(23);
fn main() {
let a = 32;
if AT.load(Ordering::SeqCst) != a {
println!("not equal");
AT.store(a, Ordering::SeqCst);
}
}
a
。您正在使用
a
订购的事实对我来说意味着您没有通过避免写作来维护特定的订购约束。
我知道这没有单一的原子指令来满足所描述的操作。但是,可以实施一个正式的原子操作来满足要求(从外部观察者的角度出现原子质的正式):
SeqCst
该函数具有仅当已知值不等于新值的属性。它以更高的阅读压力为代价实现了这一保证。它避免了原始代码中的种族条件,即在use std::sync::atomic::{AtomicI32, Ordering};
/// Store a value into target if it doesn't already have that value. Returns
/// true if a store occurred.
fn store_if_neq(target: &AtomicI32, value: i32) -> bool {
let mut current = target.load(Ordering::Acquire);
loop {
if current == value {
break false;
} else {
current = match target.compare_exchange_weak(
current,
value,
Ordering::Release,
Ordering::Acquire,
) {
Ok(_) => break true,
Err(new) => new,
}
};
}
}
load
之间,原子可能从另一个线程变得等于store
。
,但再次,我真的只会做无条件的商店。我真的不知道你为什么要避免它。