掌握mpsc通道、Mutex、RwLock等线程同步原语。
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = msc::channel();
thread::spawn(move || {
let vals = vec![
String::from("hi"),
String::from("from"),
String::from("thread"),
];
for val in vals {
tx.send(val).unwrap();
}
});
for received in rx {
println!("收到: {}", received);
}
}
✅ 编译验证通过
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = msc::channel();
let tx1 = tx.clone();
thread::spawn(move || {
let vals = vec![String::from("A1"), String::from("A2")];
for v in vals { tx1.send(v).unwrap(); }
});
thread::spawn(move || {
let vals = vec![String::from("B1"), String::from("B2")];
for v in vals { tx.send(v).unwrap(); }
});
for received in rx {
println!("收到: {}", 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!("结果: {}", *counter.lock().unwrap());
}
✅ 编译验证通过
use std::sync::{Arc, RwLock};
fn main() {
let data = Arc::new(RwLock::new(vec![1, 2, 3]));
// 多个读者可同时持有
let r1 = data.read().unwrap();
let r2 = data.read().unwrap(); // ✅ 同时读
println!("r1={:?} r2={:?}", *r1, *r2);
drop(r1); drop(r2);
// 写需要独占
let mut w = data.write().unwrap();
w.push(4);
}
✅ 编译验证通过
| 原语 | 场景 | 特点 |
|---|---|---|
Mutex | 互斥访问 | 同一时刻一个线程 |
RwLock | 读多写少 | 多读者或单写者 |
mpsc | 消息传递 | 生产者-消费者 |
Atomic | 简单计数 | 无锁,高性能 |
Barrier | 同步点 | 等待所有线程到达 |
Condvar | 条件等待 | 等待条件满足 |
用mpsc实现多生产者多消费者模式。
用Arc+RwLock+HashMap实现并发缓存。
用Mutex实现哲学家就餐问题的解决方案。
掌握线程同步——安全共享数据的艺术
系统编程的核心挑战是在不牺牲安全的前提下获得最大性能。Rust如何实现这个目标:
所有权系统在编译期确定每个值的生命周期,不需要运行时垃圾回收。这意味着:无停顿、可预测延迟、更少内存占用。
泛型单态化、内联、LLVM优化——高级代码编译为与手写C相当的机器码。
Send/Sync trait在编译期保证:如果是并发访问,要么只读,要么互斥。数据竞争不可能发生。
| 特性 | Rust | C | C++ |
|---|---|---|---|
| 内存安全 | ✅ 编译期 | ❌ 手动 | ⚠️ 部分RAII |
| 线程安全 | ✅ 编译期 | ❌ | ❌ |
| 无GC | ✅ | ✅ | ✅ |
| 零成本抽象 | ✅ | ⚠️ 宏 | ✅ 模板 |
| 包管理 | ✅ Cargo | ❌ | ⚠️ vcpkg |
| 学习曲线 | 陡峭 | 中等 | 极陡 |
即使Rust保证内存安全和线程安全,仍需注意:
以下资源帮助你深入学习本课主题:
本课涉及的核心概念,确保你理解每一个:
| 术语 | 说明 |
|---|---|
| 所有权 | Rust内存管理的核心机制,每个值有唯一所有者 |
| 借用 | 通过引用访问数据,不获取所有权 |
| 生命周期 | 引用有效的范围,编译期分析工具 |
| trait | Rust的接口/抽象机制,类似其他语言的接口 |
| 泛型 | 参数化类型,零成本抽象 |
| 模式匹配 | 强大的数据解构和分支机制 |
| 零成本抽象 | 高层抽象不引入运行时开销 |
| fearless concurrency | 编译器保证线程安全 |
Q: Rust学习曲线真的很陡吗?
A: 前期确实需要适应所有权和借用检查器,但一旦理解了,这些概念会让你的代码更可靠。大多数人2-4周就能上手。
Q: Rust适合什么项目?
A: 系统编程、Web服务、CLI工具、嵌入式、WASM、网络服务、数据库等。基本上需要性能和安全的地方都适合。
Q: 遇到编译错误怎么办?
A: Rust编译器的错误信息非常友好!仔细阅读,通常会指出问题所在和修复建议。也可以用cargo clippy获取更多提示。