Day 7:第八週總結練習

學習目標

  • 綜合運用執行緒、訊息傳遞、共享狀態
  • 完成一個小型的並發專案
  • 理解「編譯器保證並發安全」的價值

今日重點

本週回顧

  1. thread::spawn(move、join)
  2. 收集執行緒結果
  3. mpsc 訊息傳遞、多發送者
  4. Mutex 共享狀態
  5. 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)。