⥠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!
ââââ 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 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!) |
đ§ Diagnostischer Selbst-Check
ĂberprĂŒfe dein VerstĂ€ndnis von Ownership, Borrowing und Typensicherheit, bevor du die Ăbung in der Web-IDE bearbeitest.