Rust 并发编程:原子操作、锁与线程安全深度解析
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 {}: {:?}本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













