Day 7:第八週總結練習
學習目標
- 綜合運用執行緒、訊息傳遞、共享狀態
- 完成一個小型的並發專案
- 理解「編譯器保證並發安全」的價值
今日重點
本週回顧
- thread::spawn(move、join)
- 收集執行緒結果
- mpsc 訊息傳遞、多發送者
- Mutex 共享狀態
- Arc vs Rc、Send / Sync
綜合練習:並行求和
寫一支程式,把一個大數列切成多塊,用多執行緒「並行」求總和,最後匯總。
use std::thread;
fn main() {
let data: Vec<i64> = (1..=1000).collect();
let workers = 4;
// 切成 4 塊,各執行緒算一段
let chunk = data.len() / workers;
let mut handles = vec![];
for w in 0..workers {
let start = w * chunk;
let end = if w == workers - 1 { data.len() } else { start + chunk };
let slice = data[start..end].to_vec(); // 每段獨立擁有
handles.push(thread::spawn(move || {
slice.iter().sum::<i64>()
}));
}
let total: i64 = handles.into_iter().map(|h| h.join().unwrap()).sum();
println!("總和 = {}", total); // 505000
}
挑戰
- 改用 mpsc 版本:每個執行緒把結果 send 回主執行緒匯總。
- 改用 Arc<Mutex<...>> 版本:每個執行緒加總後累加到共享 total。
- 比較三種做法的程式碼差異。
反思
Rust 在**編譯時**就阻止資料競爭(例如把不可變借用送到多執行緒)。思考這讓 debug 變簡單多少。
自我檢查
- 能寫出並行求和的程式
- 能分別用 join / mpsc / Mutex 三種方式
- 理解並發安全的保證來自型別系統
- 知道訊息傳遞 vs 共享狀態的取捨
週總結
你學會了 Rust 的並發三寶:執行緒 + 訊息傳遞 + 共享狀態。
下一週進入非同步程式設計(async/await with tokio)。