掌握Rust线程创建、JoinHandle、move闭包、线程安全与Send/Sync trait。
use std::thread;
use std::time::Duration;
fn main() {
// 创建线程
let handle = thread::spawn(|| {
for i in 1..=5 {
println!("子线程: {}", i);
thread::sleep(Duration::from_millis(100));
}
});
for i in 1..=3 {
println!("主线程: {}", i);
thread::sleep(Duration::from_millis(100));
}
// 等待线程完成
handle.join().unwrap();
}
✅ 编译验证通过
use std::thread;
fn main() {
let v = vec![1, 2, 3];
// move将v的所有权移入线程
let handle = thread::spawn(move || {
println!("向量: {:?}", v);
});
handle.join().unwrap();
}
✅ 编译验证通过
use std::thread;
fn main() {
let handles: Vec<_> = (0..5).map(|i| {
thread::spawn(move || {
let result = i * i;
println!("线程{}: {}²={}", i, i, result);
result
})
}).collect();
let results: Vec<i32> = handles.into_iter()
.map(|h| h.join().unwrap())
.collect();
println!("结果: {:?}", results);
}
✅ 编译验证通过
自动推导:如果所有字段都Send/Sync,则结构体也Send/Sync。
反例:Rc<T>不是Send(引用计数非原子),RefCell<T>不是Sync(运行时借用检查非线程安全)。
将数组分成N份,每份一个线程计算平方和,最后汇总。
实现简单的固定大小线程池。
使用std::thread::scope实现借用数据的多线程处理。
掌握Rust线程——fearless concurrency的第一步
系统编程的核心挑战是在不牺牲安全的前提下获得最大性能。Rust如何实现这个目标:
所有权系统在编译期确定每个值的生命周期,不需要运行时垃圾回收。这意味着:无停顿、可预测延迟、更少内存占用。
泛型单态化、内联、LLVM优化——高级代码编译为与手写C相当的机器码。
Send/Sync trait在编译期保证:如果是并发访问,要么只读,要么互斥。数据竞争不可能发生。
| 特性 | Rust | C | C++ |
|---|---|---|---|
| 内存安全 | ✅ 编译期 | ❌ 手动 | ⚠️ 部分RAII |
| 线程安全 | ✅ 编译期 | ❌ | ❌ |
| 无GC | ✅ | ✅ | ✅ |
| 零成本抽象 | ✅ | ⚠️ 宏 | ✅ 模板 |
| 包管理 | ✅ Cargo | ❌ | ⚠️ vcpkg |
| 学习曲线 | 陡峭 | 中等 | 极陡 |
即使Rust保证内存安全和线程安全,仍需注意:
以下练习帮助你将本课知识应用到实际场景:
阅读以下代码片段,找出潜在问题并改进:
// 仔细阅读,思考有什么问题
fn process(data: Vec) -> Vec {
let mut result = Vec::new();
for i in 0..data.len() {
result.push(data[i] * 2);
}
result
}
改进建议:使用迭代器、预分配容量、考虑溢出。
用criterion基准测试对比以下实现的性能差异:
为以下场景设计Rust API:一个支持过期时间的缓存系统。考虑所有权、错误处理和泛型。
通过本课的学习,你应该掌握以下核心要点:
如果某个要点还不够清晰,回顾本课的代码示例和内存图,动手编写代码验证你的理解。
以下资源帮助你深入学习本课主题:
本课涉及的核心概念,确保你理解每一个:
| 术语 | 说明 |
|---|---|
| 所有权 | Rust内存管理的核心机制,每个值有唯一所有者 |
| 借用 | 通过引用访问数据,不获取所有权 |
| 生命周期 | 引用有效的范围,编译期分析工具 |
| trait | Rust的接口/抽象机制,类似其他语言的接口 |
| 泛型 | 参数化类型,零成本抽象 |
| 模式匹配 | 强大的数据解构和分支机制 |
| 零成本抽象 | 高层抽象不引入运行时开销 |
| fearless concurrency | 编译器保证线程安全 |
Q: Rust学习曲线真的很陡吗?
A: 前期确实需要适应所有权和借用检查器,但一旦理解了,这些概念会让你的代码更可靠。大多数人2-4周就能上手。
Q: Rust适合什么项目?
A: 系统编程、Web服务、CLI工具、嵌入式、WASM、网络服务、数据库等。基本上需要性能和安全的地方都适合。
Q: 遇到编译错误怎么办?
A: Rust编译器的错误信息非常友好!仔细阅读,通常会指出问题所在和修复建议。也可以用cargo clippy获取更多提示。