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.
| Aspekt | Mutex | Semaphor |
|---|---|---|
| Zweck | Gegenseitiger Ausschluss: ein Thread zur Zeit im kritischen Abschnitt | Zählen: den Zugriff auf einen Pool von N Ressourcen begrenzen oder Ereignisse zwischen Threads signalisieren |
| Wert | Gesperrt oder entsperrt (binär) | Ein nicht negativer ganzzahliger Zählerstand (ein binäres Semaphor ist der Sonderfall 0 oder 1) |
| Besitz | Gehört dem Thread, der ihn gesperrt hat, und dieser Thread sollte ihn auch freigeben | Kein Besitzer: Jeder Thread kann post oder signal aufrufen |
| Operationen | Lock und Unlock | Wait (P, Dekrement) und Post (V, Inkrement) |
| Signalisierung zwischen Threads | Dafür nicht vorgesehen | Ja: zum Beispiel ein Producer, der einem Consumer ein Signal gibt |
| Prioritätsinversion | Wird oft durch Prioritätsvererbung vermieden | Wird meist nicht unterstützt |
| Typische Einsatzgebiete | Schutz einer gemeinsamen Datenstruktur wie einer Liste oder eines Zählers | Begrenzung eines Verbindungspools, begrenzte Producer-Consumer-Puffer, Signalisierung von einem Interrupt-Handler an eine Task |
| Häufige Fallstricke | Deadlock durch uneinheitliche Sperrreihenfolge oder vergessenes Entsperren | Verlorene Signale und Deadlock, wenn die Zählerstände nicht zusammenpassen |
Die Zahlenangaben sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.