原子比较和存储如果不相等

问题描述 投票:0回答:1
可以在原子上比较不平等,如果它是正确的(不是平等),则将其与之相比的值。以下代码无法使用单个原子操作实现此目的

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); } }

	
rust
1个回答
0
投票
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,但再次,我真的只会做无条件的商店。我真的不知道你为什么要避免它。

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.