- 代码示例:
use std::sync::{Arc, Mutex};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;
fn main() {
let counter = Arc::new(AtomicUsize::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter_clone = Arc::clone(&counter);
let handle = thread::spawn(move || {
for _ in 0..1000 {
counter_clone.fetch_add(1, Ordering::SeqCst);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final counter value: {}", counter.load(Ordering::SeqCst));
}
- 原子操作原理:
- 原子性:原子操作是不可分割的操作,在执行过程中不会被其他线程打断。在多核处理器环境下,这保证了多个线程对共享数据的操作不会相互干扰。例如在上述代码中,
fetch_add
操作是原子的,一个线程执行fetch_add
时,其他线程不会看到部分完成的操作。
- 内存顺序:通过
Ordering
枚举来指定内存顺序。Ordering::SeqCst
(顺序一致性)是最严格的内存顺序,它保证所有线程都以相同的顺序看到所有原子操作。这确保了多线程并发访问共享数据时的一致性。不同的Ordering
选项适用于不同的性能和同步需求场景,例如Relaxed
是最宽松的顺序,仅保证原子性,但不保证操作的顺序一致性。