💎 Lehrpfad 4: Fearless Concurrency & Systems Master

Rust 13: Threads & MPSC Channels

Entdecke Rusts berühmte Fearless Concurrency: Starte native OS-Threads mit std::thread::spawn, kommuniziere sicher über Multi-Producer Single-Consumer (MPSC) Channels und nutze die Marker-Traits Send & Sync.

📂 Dateien dieser Lerneinheit:
📄 aufgabe.rs (Startercode) 🧪 test_aufgabe.rs (Tests) 💡 musterloesung.rs (Lösung) 📖 README.md

⚡ 1. Native Threads & Join Handles

In Rust erzeugt std::thread::spawn echte Betriebssystem-Threads. Durch das Ownership-System garantiert der Rust-Compiler zur Compile-Zeit, dass keine Data Races (gleichzeitige ungeschützte Schreibzugriffe) auftreten können!

[Main Thread] ──┬─── thread::spawn(move || work(1)) ───> [Worker 1] ──┐
                ├─── thread::spawn(move || work(2)) ───> [Worker 2] ──┼──> handle.join() (Sammeln & Weiter)
                └─── thread::spawn(move || work(3)) ───> [Worker 3] ──┘
use std::thread;

let v = vec![1, 2, 3];

// 'move' überträgt den Besitz von 'v' sicher in den neuen Thread
let handle = thread::spawn(move || {
    println!("Vector im Thread: {:?}", v);
    v.iter().sum::<i32>()
});

let total = handle.join().expect("Thread panickte!");
println!("Ergebnis: {}", total);

🛡️ 2. MPSC Channels (Multi-Producer, Single-Consumer)

Das Go- & Erlang-Motto gilt auch in Rust: "Do not communicate by sharing memory; instead, share memory by communicating."

[Worker 1 (tx1)] ──┐
[Worker 2 (tx2)] ──┼───> [ MPSC Channel Queue ] ───> [Main Receiver (rx.recv())]
[Worker 3 (tx3)] ──┘
use std::sync::mpsc;
use std::thread;

let (tx, rx) = mpsc::channel();

for i in 0..3 {
    let tx_clone = tx.clone();
    thread::spawn(move || {
        tx_clone.send(format!("Ergebnis von Worker {}", i)).unwrap();
    });
}
drop(tx); // WICHTIG: Original-Sender droppen, damit rx schließt!

for msg in rx {
    println!("Empfangen: {}", msg);
}

📑 3. Cheat-Sheet: Die Send & Sync Marker-Traits

Marker-Trait Bedeutung Beispiele (Gültig / Ungültig)
Send Ownership darf an einen anderen Thread übertragen werden ✅ Primitive, Vec<T>, Box<T>  |  ❌ Rc<T> (nicht Send!)
Sync Referenz &T darf von mehreren Threads gleichzeitig gelesen werden (T ist Sync gdw. &T Send ist) ✅ Arc<T>, Mutex<T>  |  ❌ RefCell<T> (nicht Sync!)

🎯 Aufgaben & Checkliste in aufgabe.rs

💻 In Web-IDE öffnen → ← Zurück zu Rust 12 Weiter zu Rust 14: Shared State →