44·并发编程高级

原子操作与原子类型

原子操作与原子类型

学习目标

  1. 理解原子操作
  2. 掌握 AtomicI32 等类型
  3. 理解内存顺序

核心概念

原子类型

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

    // Compare-And-Swap
    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;

// Relaxed: 最弱,只保证原子性
// Release: 写入时使用
// Acquire: 读取时使用
// AcqRel: 读写都用
// SeqCst: 最强(默认推荐)

自旋锁实现

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_exchangeCAS 操作
Ordering::SeqCst默认推荐

练习编辑器

rust
Loading...