Mutex versus semaphore: wederzijdse uitsluiting en synchronisatie vergeleken
Een mutex beschermt een kritieke sectie, zodat slechts één thread tegelijk een gedeelde resource gebruikt. De thread die de mutex vergrendelt, moet hem ook weer ontgrendelen. Een semafoor is een teller die bepaalt hoeveel threads tegelijk een beperkte resource gebruiken, en hij kan ook worden gebruikt om een gebeurtenis van de ene thread aan de andere te melden. Een mutex draait om eigendom en uitsluiting, een semafoor om tellen en signaleren.
| Kenmerk | Mutex | Semafoor |
|---|---|---|
| Doel | Wederzijdse uitsluiting. Slechts één thread tegelijk in de kritieke sectie | Tellen. Toegang tot een pool van N resources beperken of gebeurtenissen tussen threads signaleren |
| Waarde | Vergrendeld of ontgrendeld (binair) | Een geheel getal van 0 of meer (een semafoor die alleen 0 of 1 is, heet een binaire semafoor) |
| Eigenaar | Eigendom van de thread die vergrendelt, en die thread hoort te ontgrendelen | Geen eigenaar. Elke thread kan posten of signaleren |
| Bewerkingen | Lock en unlock | Wait (P, verlagen) en post (V, verhogen) |
| Signalering tussen threads | Niet bedoeld daarvoor | Mogelijk. Bijvoorbeeld een producent die een consument waarschuwt |
| Prioriteitsinversie | Vaak te vermijden met prioriteitsovererving | Meestal niet ondersteund |
| Belangrijkste toepassingen | Gedeelde datastructuren zoals lijsten en tellers beschermen | Het aantal verbindingen in een pool beperken, producent-consumentbuffers met beperkte capaciteit, een taak waarschuwen vanuit een interrupt handler |
| Veelvoorkomende valkuilen | Deadlock door inconsistente lockvolgorde, vergeten te ontgrendelen | Gemiste signalen en deadlock door een onjuiste teller |
De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.