Mutex vs. Semaphor: Unterschiede im Überblick

Ein Mutex schützt einen kritischen Abschnitt, sodass nur ein Thread zur Zeit eine gemeinsame Ressource nutzen kann, und derjenige Thread, der ihn gesperrt hat, muss ihn auch wieder freigeben. Ein Semaphor ist ein Zähler: Er steuert, wie viele Threads eine begrenzte Ressource nutzen können, und kann auch dazu dienen, Ereignisse von einem Thread an einen anderen zu signalisieren. Ein Mutex dreht sich um Besitz und Ausschluss, ein Semaphor ums Zählen und Signalisieren.

AspektMutexSemaphor
ZweckGegenseitiger Ausschluss: ein Thread zur Zeit im kritischen AbschnittZählen: den Zugriff auf einen Pool von N Ressourcen begrenzen oder Ereignisse zwischen Threads signalisieren
WertGesperrt oder entsperrt (binär)Ein nicht negativer ganzzahliger Zählerstand (ein binäres Semaphor ist der Sonderfall 0 oder 1)
BesitzGehört dem Thread, der ihn gesperrt hat, und dieser Thread sollte ihn auch freigebenKein Besitzer: Jeder Thread kann post oder signal aufrufen
OperationenLock und UnlockWait (P, Dekrement) und Post (V, Inkrement)
Signalisierung zwischen ThreadsDafür nicht vorgesehenJa: zum Beispiel ein Producer, der einem Consumer ein Signal gibt
PrioritätsinversionWird oft durch Prioritätsvererbung vermiedenWird meist nicht unterstützt
Typische EinsatzgebieteSchutz einer gemeinsamen Datenstruktur wie einer Liste oder eines ZählersBegrenzung eines Verbindungspools, begrenzte Producer-Consumer-Puffer, Signalisierung von einem Interrupt-Handler an eine Task
Häufige FallstrickeDeadlock durch uneinheitliche Sperrreihenfolge oder vergessenes EntsperrenVerlorene Signale und Deadlock, wenn die Zählerstände nicht zusammenpassen

Die Zahlenangaben sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.

Wann welches einsetzen

Mutex
Wenn mehrere Threads auf dieselben Daten zugreifen und immer nur einer das darf.
Semaphor
Wenn Sie begrenzen müssen, wie viele Threads eine Ressource nutzen, oder einen Thread wecken wollen, wenn etwas passiert.

FAQ

Ist ein Mutex dasselbe wie ein binäres Semaphor?

Nicht ganz. Beide haben zwei Zustände, aber ein Mutex hat einen Besitzer, der ihn freigeben muss, und unterstützt oft Prioritätsvererbung, während ein Semaphor keinen Besitzer hat und von jedem Thread signalisiert werden kann.

Wann brauche ich ein zählendes Semaphor?

Wenn Sie begrenzen müssen, wie viele Threads eine Ressource nutzen, etwa einen Pool von N Verbindungen, oder die verfügbaren Einträge in einem Producer-Consumer-Puffer zählen müssen.

Was ist ein Deadlock?

Eine Situation, in der Threads ewig aufeinander warten, zum Beispiel hält Thread A Sperre 1 und wartet auf Sperre 2, während Thread B Sperre 2 hält und auf Sperre 1 wartet. Das Anfordern der Sperren in einheitlicher Reihenfolge verhindert das.

Was ist der Unterschied zwischen einem Spinlock und einem Mutex?

Ein Spinlock wartet aktiv (Busy-Waiting) und eignet sich für sehr kurze Wartezeiten auf Mehrkernsystemen. Ein Mutex versetzt den wartenden Thread in den Schlafzustand, was bei längeren Wartezeiten besser ist.

Wichtige Begriffe erklärt

Mutex (gegenseitiger Ausschluss)
Eine Sperre, die nur ein Thread gleichzeitig halten kann. Typischerweise schläft ein Thread, der sie nicht bekommt, und gibt die CPU ab; das Betriebssystem weckt ihn, wenn die Sperre freigegeben wird.
Semaphor
Ein Synchronisationsmechanismus mit einem Zähler für die verbleibenden Einheiten: vor der Nutzung dekrementieren (bei 0 warten), danach inkrementieren. Dient zur Verwaltung von Ressourcen mit fester Stückzahl.
Spinlock (Busy-Wait-Sperre)
Eine Sperre, bei der durch wiederholtes Prüfen der Sperrvariable in einer Schleife gewartet wird. Schnell bei kurzen Wartezeiten, belegt aber beim Warten weiter die CPU.
Verklemmung (Deadlock)
Ein Zustand, in dem Threads jeweils eine Ressource halten und auf eine von einem anderen gehaltene warten, so dass keiner weiterkommt. Eine feste globale Sperrreihenfolge verhindert ihn.

Weitere Vergleiche