原子操作存储和加载常用方法
store
方法:用于将值存储到原子变量中。例如:
use std::sync::atomic::{AtomicI32, Ordering};
let atomic_var = AtomicI32::new(0);
atomic_var.store(42, Ordering::SeqCst);
load
方法:用于从原子变量中加载值。例如:
use std::sync::atomic::{AtomicI32, Ordering};
let atomic_var = AtomicI32::new(42);
let value = atomic_var.load(Ordering::SeqCst);
通过选择合适内存序优化性能
Ordering::SeqCst
(顺序一致性):
- 特性:这是最严格的内存序。所有线程对原子变量的操作按全序排列,就好像所有操作在一个全局的单线程中执行一样。这保证了最强的一致性,但性能开销较大。
- 适用场景:适用于需要确保所有线程对操作顺序达成一致的场景,比如实现锁机制等对一致性要求极高的情况。
Ordering::Release
和Ordering::Acquire
:
- 特性:
Release
存储操作确保在此之前的所有写操作在存储完成前对其他线程可见。Acquire
加载操作确保在此之后的所有读操作在加载完成后才能看到其他线程对原子变量的修改。
- 适用场景:适用于需要在线程间传递数据的场景。比如一个线程向共享内存写入数据(
Release
),另一个线程从共享内存读取数据(Acquire
),可以保证数据传递的正确性且性能开销小于SeqCst
。例如生产者 - 消费者模型。
Ordering::Relaxed
:
- 特性:这是最宽松的内存序。只保证原子操作本身的原子性,不提供任何内存顺序保证。不同线程对原子变量的操作顺序可以是任意的。
- 适用场景:适用于对操作顺序没有严格要求,只需要保证原子性的场景,例如原子计数器的简单自增操作。在这种场景下使用
Relaxed
可以获得最佳性能。