Rust 并发编程中的 Channel、Mutex 与 Arc
wxk1991 Lv5

Rust 并发编程中的 Channel、Mutex 与 Arc

Rust 的并发模型很有辨识度:它不只是提供线程 API,还通过类型系统限制危险的数据共享方式。常见并发工具主要有 Channel、Mutex 和 Arc。


一、线程基础

1
2
3
4
5
6
7
8
9
use std::thread;

fn main() {
let handle = thread::spawn(|| {
println!("run in thread");
});

handle.join().unwrap();
}

join 会等待线程结束。


二、Channel 传递消息

Channel 适合“一个线程把结果发给另一个线程”:

1
2
3
4
5
6
7
8
9
10
use std::sync::mpsc;
use std::thread;

let (tx, rx) = mpsc::channel();

thread::spawn(move || {
tx.send("done").unwrap();
});

println!("{}", rx.recv().unwrap());

这种方式的好处是少共享状态,多传递消息。


三、Mutex 保护共享数据

当确实需要共享可变状态时,可以用 Mutex

1
2
3
4
5
6
7
8
9
10
11
12
13
use std::sync::{Arc, Mutex};
use std::thread;

let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];

for _ in 0..10 {
let counter = Arc::clone(&counter);
handles.push(thread::spawn(move || {
let mut value = counter.lock().unwrap();
*value += 1;
}));
}

Mutex 负责互斥,Arc 负责多线程引用计数。


四、选择建议

优先考虑 Channel,因为它更容易控制数据流。只有当多个任务确实需要读写同一份状态时,再考虑 Arc<Mutex<T>>

Rust 不是让并发变得完全简单,而是让很多危险写法无法通过编译。你需要多想一步,但调试时会少掉很多隐蔽问题。