← SEARCHABLE ARCHIVE
Rust · 2026-08-11

Rust von den Grundlagen bis zum Profi — Folge 9

Konfigurieren der Parallelität mit Threads, Kanälen und Mutexes

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Rust schränkt den gemeinsamen Zugriff auf Typen ein, was zu Datenwettläufen führen kann. Selbst wenn Sie Threads, Kanäle oder Mutexe verwenden, müssen Sie die Aufgabenbeendigung und den Sperrbereich selbst entwerfen.

Threads starten und beenden

use std::thread;

let handle = thread::spawn(|| {
    load_world_data()
});

let world = handle
    .join()
    .expect("worker thread panicked");

Der an spawn übergebene Abschluss wird in einem neuen Thread ausgeführt. join wartet auf den Abschluss der Aufgabe und gibt zurück, ob dadurch eine Panik ausgelöst wird oder nicht.

Wenn ein Abschluss einen äußeren Wert verwendet, muss er den Thread überleben, daher wird der Besitz häufig auf move übertragen.

Nachricht an Kanal senden

use std::sync::mpsc;

let (sender, receiver) = mpsc::channel();

thread::spawn(move || {
    sender.send(String::from("Loaded")).unwrap();
});

if let Ok(message) = receiver.recv() {
    println!("{message}");
}

Kanäle verschieben Nachrichten von einer Aufgabe zu einer anderen, anstatt Werte zu teilen. Wenn alle Sender verschwinden, weiß der Empfänger, dass der Kanal geschlossen ist.

Arc und Mutex

use std::sync::{Arc, Mutex};

let score = Arc::new(Mutex::new(0));
let worker_score = Arc::clone(&score);

let handle = thread::spawn(move || {
    let mut value = worker_score.lock().unwrap();
    *value += 10;
});

handle.join().unwrap();

Arc teilt den Besitz zwischen Threads und Mutex erlaubt jeweils nur einen Änderungszugriff. Das Halten einer Sperre über einen längeren Zeitraum oder der Erwerb mehrerer Sperren in einer anderen Reihenfolge kann zu schlechter Leistung und Deadlocks führen.

Bei der Parallelität geht es nicht darum, die Anzahl der Threads zu erhöhen. Nachdem Sie den gemeinsamen Status reduziert und Nachrichtengrenzen definiert haben, müssen Sie die Größe des Vorgangs und die Latenz tatsächlich messen.