原子类型

原子类型

原子类型是最简单的控制共享资源访问的一种机制,相比较于后面将介绍的锁而言,原子类型不需要开发者处理加锁和释放锁的问题,同时支持修改,读取等操作,还具备较高的并发性能,从硬件到操作系统,到各个语言,基本都支持。在标准库 std::sync::atomic中,你将在里面看到 Rust 现有的原子类型,包括 AtomicBoolAtomicIsizeAtomicPtrAtomicUsize。这 4 个原子类型基本能满足百分之九十的共享资源安全访问的需要。下面我们就用原子类型,结合共享内存的知识,来展示一下一个线程修改,一个线程读取的情况:

use std::thread;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};

fn main() {
    let var : Arc<AtomicUsize> = Arc::new(AtomicUsize::new(5));
    let share_var = var.clone();

    // 创建一个新线程
    let new_thread = thread::spawn(move|| {
        println!("share value in new thread: {}", share_var.load(Ordering::SeqCst));
        // 修改值
        share_var.store(9, Ordering::SeqCst);
    });

    // 等待新建线程先执行
    new_thread.join().unwrap();
    println!("share value in main thread: {}", var.load(Ordering::SeqCst));
}
share value in new thread: 5
share value in main thread: 9

结果表明新建线程成功的修改了值,并在主线程中获取到了最新值,你也可以尝试使用其他的原子类型。此处我们可以思考一下,如果我们用Arc::new(*mut Box)是否也可以做到? 为什么? 思考后,大家将体会到 Rust 在多线程安全方面做的有多么的好。除了原子类型,我们还可以使用锁来实现同样的功能。

上一页