惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - PKICA

汇编语言语法详解 gdb汇编调试 gdb-pwndbg的安装与使用指南 gdb调试插件gef C语言thread_local linux系统readelf命令使用指南 gcore转储进程内存 gdb查看命令 RGB与YUV颜色编码的区别 C++ STL求两个集合交集差集 gdb调试集锦 ubuntu24.0.4使用root用户登录 ubuntu24.0.4输入密码后跳回登录界面 AI内存压缩技术TurboQuant及存疑 ubuntu切换到指定内核版本 在没有顶级科技大佬直接背书的情况下deepseek为啥能够异军突起? HuggingFace和deepseek的关系 当前主流AI大模型 Rust写时克隆Cow系列2
Rust原子类型
PKICA · 2026-04-10 · via 博客园 - PKICA

Rust 中的原子类型(Atomic Types)定义在 std::sync::atomic 模块中,它们用于在多线程环境下安全地共享和修改数据,而无需使用重量级的锁(如 Mutex)。原子操作是无锁的(Lock-free),通常速度更快,是构建其他并发原语的基础。

1. 核心原子类型

Rust 提供了多种基本类型的原子版本,常用的包括:

  • 整数原子:AtomicU8, AtomicU16, AtomicU32, AtomicU64, AtomicUsize(无符号)
  • 有符号整数原子:AtomicI8, AtomicI16, AtomicI32, AtomicI64, AtomicIsize
  • 布尔原子:AtomicBool
  • 指针原子:AtomicPtr<T>

关于 AtomicU16
AtomicU16 是一种专门用于安全共享 16 位无符号整数的原子类型,内存布局与普通的 u16 相同。可以在不需要 mut 关键字的情况下修改原子类型的值(利用了内部可变性)。

2. 原子类型常用方法 

原子类型提供了一系列原子的(不可中断的)操作方法:

  • new(v): 创建一个新值。
  • load(&self, Ordering): 原子地读取当前值。
  • store(&self, val, Ordering): 原子地写入新值。
  • swap(&self, val, Ordering): 原子地写入新值并返回旧值。
  • compare_exchange / compare_and_swap: 比较并交换值 (CAS)。
  • fetch_add / fetch_sub: 原子地加/减。
  • fetch_and / fetch_or / fetch_xor: 原子地位操作。 [3, 10]

3. 原子操作的核心:内存排序 (Ordering)

每个原子操作都需要一个 Ordering 参数,它决定了并发环境下指令执行的顺序和内存可见性:

  • Ordering::Relaxed: 仅保证操作本身是原子的,没有保证顺序,性能最好。
  • Ordering::Acquire: 用于读取,保证在这个读取之后的操作不会被重排序到这个读取之前。
  • Ordering::Release: 用于写入,保证在这个写入之前的操作不会被重排序到这个写入之后。
  • Ordering::AcqRel: 同时包含 Acquire 和 Release。
  • Ordering::SeqCst: 顺序一致性,最强,所有线程看到的操作顺序是一致的。

4. AtomicU16 使用示例

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

fn main() {
    // 1. 创建 AtomicU16
    let atom_u16 = Arc::new(AtomicU16::new(100));

    let mut handles = vec![];
    for _ in 0..10 {
        let atom_clone = Arc::clone(&atom_u16);
        let handle = thread::spawn(move || {
            // 2. 原子加法 (fetch_add)
            // 即使多个线程同时操作,也能保证数值正确
            atom_clone.fetch_add(1, Ordering::SeqCst);
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    // 3. 读取原子值 (load)
    let final_val = atom_u16.load(Ordering::SeqCst);
    println!("Final value: {}", final_val); // 输出:Final value: 110
}

5. 原子类型与普通类型的区别

线程安全 默认不可多线程写 Sync,安全地跨线程共享 修改 需要 &mut 不需要 &mut (支持内部可变性) 原子性 可能跨越多个指令 操作是不可中断的 锁 通常需要锁 不需要锁,CAS 机制 性能 极快 较快,取决于 CAS 冲突情况
特性普通类型 (如 u16)原子类型 (如 AtomicU16)

6. 注意事项

  • 原子类型并不总是比 Mutex 快。如果争用非常激烈(许多线程同时频繁修改同一个原子变量),CAS 循环(如 fetch_add 的底层实现)可能比锁导致更严重的 CPU 损耗。
  • 并不是所有平台都支持 128 位原子操作。
  • 使用 Ordering::Relaxed 可以获得最高性能,但必须确保你的算法即使在弱顺序下也是正确的。

参考资料: