📂 Dateien dieser Lerneinheit:
⚡ 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] ──┘
├─── 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)] ──┘
[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!) |