EMZETT.
Login

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 False
class 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

KonzeptZweck
SemaphoreErlaubt bis zu n Threads gleichzeitig (z. B. Verbindungs-Pool)
Read/Write-LockViele Leser oder ein Schreiber
Atomare VariablenUnteilbare Operationen ohne Sperre
Condition VariableThreads 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