原子操作与原子类型
学习目标
- 理解原子操作
- 掌握
AtomicI32 等类型
- 理解内存顺序
核心概念
原子类型
use std::sync::atomic::{AtomicI32, AtomicBool, Ordering};
use std::sync::Arc;
use std::thread;
fn main() {
let counter = Arc::new(AtomicI32::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
handles.push(thread::spawn(move || {
counter.fetch_add(1, Ordering::SeqCst);
}));
}
for h in handles { h.join().unwrap(); }
println!("计数: {}", counter.load(Ordering::SeqCst));
}
CAS 操作
use std::sync::atomic::{AtomicI32, Ordering};
fn main() {
let val = AtomicI32::new(0);
loop {
let current = val.load(Ordering::SeqCst);
let new = current + 1;
match val.compare_exchange_weak(
current, new, Ordering::SeqCst, Ordering::Relaxed
) {
Ok(_) => break,
Err(_) => continue,
}
}
println!("值: {}", val.load(Ordering::SeqCst));
}
常用原子类型
| 类型 | 说明 |
|---|
AtomicBool | 原子布尔 |
AtomicI32 | 原子 i32 |
AtomicU64 | 原子 u64 |
AtomicUsize | 原子 usize |
AtomicPtr<T> | 原子指针 |
内存顺序
use std::sync::atomic::Ordering;
自旋锁实现
use std::sync::atomic::{AtomicBool, Ordering};
struct SpinLock {
locked: AtomicBool,
}
impl SpinLock {
fn new() -> Self {
SpinLock { locked: AtomicBool::new(false) }
}
fn lock(&self) {
while self.locked.compare_exchange_weak(
false, true, Ordering::Acquire, Ordering::Relaxed
).is_err() {
std::hint::spin_loop();
}
}
fn unlock(&self) {
self.locked.store(false, Ordering::Release);
}
}
小结
| 操作 | 说明 |
|---|
load | 原子读取 |
store | 原子写入 |
fetch_add | 原子加法 |
compare_exchange | CAS 操作 |
Ordering::SeqCst | 默认推荐 |