Rust 线程安全 I

常见的线程安全类型

技术
技术Rust标准库编程语言特性并发编程多线程

2026-04-10

上篇文章简要介绍了 Rust 当中用于实现线程同步的互斥锁、读写锁和条件变量,以及在多线程中共享数据的原子引用计数。本篇将介绍“线程安全”版本的原生类型(primitive types)——原子类型。

初识原子类型

原子指的是一系列不可被 CPU 上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核 CPU 下,当某个 CPU 核心开始运行原子操作时,会先暂停其它 CPU 内核对内存的操作,以保证原子操作不会被其它 CPU 内核所干扰。由于原子操作是通过指令提供的支持,因此它的性能相比锁和消息传递会好很多。相较于锁而言,原子类型不需要开发者处理加锁和释放锁的问题(无锁不代表无需等待!当大量的冲突发生时,该等待还是得等待),同时支持读写等操作,还具备较高的并发性能,几乎所有的语言都支持原子类型。

原子类型(atomic types)是定义在 core::sync::atomic 中的一系列线程安全类型,它们提供线程间共享内存通信的功能,并且被定义为部分 Rust 原生类型的“原子”版本。

原生类型 原子类型
bool AtomicBool
i8 AtomicI8
i16 AtomicI16
i32 AtomicI32
i64 AtomicI64
isize AtomicIsize
*mut T AtomicPtr<T>
u8 AtomicU8
u16 AtomicU16
u32 AtomicU32
u64 AtomicU64
usize AtomicUsize

下面是一个简单的例子,它用于对此时存活的线程进行全局计数:

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

static GLOBAL_THREAD_COUNT: AtomicUsize = AtomicUsize::new(0);

let old_thread_count = GLOBAL_THREAD_COUNT.fetch_add(1, Ordering::Relaxed);
// 要注意打印时此值不一定是真实的
// 因为可能有线程在这段时间间隔内修改了 static 值
println!("live threads: {}", old_thread_count + 1);

参考资料