Mutex (gegenseitiger Ausschluss)
Kurz: Ein Mutex (mutual exclusion) ist eine Sperre, die sicherstellt, dass immer nur ein Thread gleichzeitig einen kritischen Codeabschnitt ausführt.
Genauer: Wer den Mutex besitzt, darf den geschützten Abschnitt betreten; alle anderen Threads warten, bis er wieder freigegeben ist. Das verhindert Race Conditions bei gemeinsam genutzten Daten, kostet aber Zeit und kann bei falscher Verwendung zum Deadlock führen.
Im Detail
import threading
sperre = threading.Lock()
kontostand = 100
def abheben(betrag):
global kontostand
with sperre: # automatisch freigegeben, auch bei Fehlern
if kontostand >= betrag:
kontostand -= betrag
return True
return Falseclass Konto {
private int stand = 100;
public synchronized boolean abheben(int betrag) { // Mutex pro Objekt
if (stand < betrag) return false;
stand -= betrag;
return true;
}
}var mu sync.Mutex
mu.Lock()
defer mu.Unlock()Verwandte Konzepte
| Konzept | Zweck |
|---|---|
| Semaphore | Erlaubt bis zu n Threads gleichzeitig (z. B. Verbindungs-Pool) |
| Read/Write-Lock | Viele Leser oder ein Schreiber |
| Atomare Variablen | Unteilbare Operationen ohne Sperre |
| Condition Variable | Threads warten auf eine Bedingung |
Regeln
- Kritische Abschnitte so klein wie möglich halten.
- Sperren immer freigeben (
with,try/finally,defer). - Mehrere Sperren in fester Reihenfolge anfordern.
- Keine langsamen Operationen (Netzwerk, Datei) unter einer Sperre ausführen.
Siehe auch: Thread, Race Condition, Deadlock, Nebenläufigkeit