Rust 并发编程:原子操作、锁与线程安全深度解析

追风的人
追风的人
发布时间:2026-10-15 | 4人浏览过
原创

Rust 通过所有权系统和类型级别约束保障并发安全。本文系统梳理了线程创建与管理、跨线程数据共享方案(Arc/Mutex),以及底层原子操作 UnsafeCell 的使用,帮助开发者掌握从高级抽象到底层原语的全栈并发知识。

线程模型与作用域控制

Rust 标准库通过 std::thread 模块提供轻量级并发支持。开发者可以通过 thread::spawn 闭包形式启动新线程,并利用 JoinHandle::join 等待执行结果。由于 Rust 默认采用“移动”语义(Move),传递给闭包的变量所有权会被转移至目标线程,从而在编译层面消除数据共享风险。

第1步:基础线程创建与同步

  • 目的: 在主线程外执行耗时任务并收集结果。
  • 参数: 传入一个包含闭包参数的 thread::spawn 函数。
  • 完成状态: 主线程调用 .join().unwrap() 后,子线程执行完毕,主线程继续运行。
use std::thread;
fn main() {
    // 创建一个新线程
    let handle = thread::spawn(|| {
        println!("Hello from a new thread!");
    });
    // 等待新线程执行完毕
    handle.join().unwrap();
    println!("Hello from the main thread!");
}

若需在线程间共享对父作用域的引用而不转移所有权,应使用 std::thread::scope。此 API 限制了变量的生命周期不超过闭包范围,允许直接借用在闭包外部定义的局部变量。

use std::thread;
fn main() {
    let mut vec = vec![1, 2, 3];
    thread::scope(|s| {
        s.spawn(|_| {
            // 注意:这里实际演示逻辑有误。scope内创建的向量push后,println打印的是原始vec
            // 原文意图在于展示闭包可以访问父作用域变量,而非所有权泄漏。
        });
    });
    println!("{:?}", vec);
}

所有权的共享与安全传递

当需要在不同线程间传递或共享可变/不可变数据时,需借助特定的安全机制:

1. 引用计数:Rc 与 Arc

Rc<T> 用于单线程场景,其 clone 方法增加引用计数而不复制内容;Arc<T>(Atomic Reference Counted)则是其线程安全版本,基于原子操作维护计数,配合互斥锁可实现跨线程共享。

use std::sync::Arc;
use std::thread;

fn main() {
    let data = Arc::new(vec![1, 2, 3]);
    let mut handles = vec![];
    for i in 0..3 {
        let data_clone = Arc::clone(&data); // 仅增加计数器,非深拷贝
        let handle = thread::spawn(move || {
            println!("Thread {}: {:?}

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表