并发编程精解
发布时间:2025年1月6日
并发编程基础
Rust 的类型系统和所有权规则帮助我们正确地编写并发代码。
线程基础
创建新线程并等待其完成:
线程创建示例
use std::thread;
use std::time::Duration;
fn main() {
let handle = thread::spawn(|| {
for i in 1..10 {
println!("hi number {} from the spawned thread!", i);
thread::sleep(Duration::from_millis(1));
}
});
handle.join().unwrap();
}
消息传递
使用通道在线程间传递消息:
消息传递示例
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let val = String::from("hi");
tx.send(val).unwrap();
});
let received = rx.recv().unwrap();
println!("Got: {}", received);
}
共享状态
使用互斥锁在线程间共享数据:
互斥锁示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", *counter.lock().unwrap());
}
Send 和 Sync trait
这两个 trait 标记了可以安全地在线程间传递和访问的类型:
Send 和 Sync 示例
// Send: 可以在线程间传递所有权
fn transfer_ownership(data: impl Send) {
thread::spawn(move || {
// data 的所有权被转移到新线程
println!("Processing data in new thread");
});
}
// Sync: 可以在线程间共享引用
fn share_data(data: &T) {
thread::spawn(move || {
// 可以安全地在多个线程中访问 data
println!("Accessing data from multiple threads");
});
}
练习
尝试完成以下并发编程练习:
- 创建一个多线程计数器程序
- 实现生产者-消费者模式
- 使用线程池处理并行任务