Mutex-objecten
Een mutex-object is een synchronisatieobject waarvan de status is ingesteld op gesignaleerd wanneer het niet eigendom is van een thread en niet-ondertekend wanneer het eigendom is. Slechts één thread tegelijk kan eigenaar zijn van een mutex-object, waarvan de naam afkomstig is van het feit dat het nuttig is om wederzijds exclusieve toegang tot een gedeelde resource te coördineren. Als u bijvoorbeeld wilt voorkomen dat twee threads tegelijkertijd naar gedeeld geheugen schrijven, wacht elke thread op eigendom van een mutex-object voordat de code wordt uitgevoerd die toegang heeft tot het geheugen. Na het schrijven naar het gedeelde geheugen wordt het mutex-object door de thread vrijgegeven.
Een thread maakt gebruik van de functie CreateMutex of CreateMutexEx om een mutex-object te maken. De thread die wordt gemaakt, kan direct eigendom van het mutex-object aanvragen en kan ook een naam opgeven voor het mutex-object. Het kan ook een niet-benoemde mutex maken. Zie interprocessynchronisatievoor meer informatie over namen voor mutex-, gebeurtenis-, semafore- en timerobjecten.
Threads in andere processen kunnen een ingang openen voor een bestaand benoemd mutex-object door de naam op te geven in een aanroep naar de OpenMutex-functie. Als u een ingang wilt doorgeven aan een niet-benoemde mutex naar een ander proces, gebruikt u de functie DuplicateHandle of overname van bovenliggende en onderliggende ingangen.
Elke thread met een ingang voor een mutex-object kan een van de wachtfuncties gebruiken om het eigendom van het mutex-object aan te vragen. Als het mutex-object eigendom is van een andere thread, blokkeert de wachtfunctie de aanvraagthread totdat het mutex-object door de ReleaseMutex--functie wordt vrijgegeven. De retourwaarde van de wachtfunctie geeft aan of de functie om een andere reden is geretourneerd dan de status van de mutex die wordt ingesteld op gesignaleerd.
Als meer dan één thread op een mutex wacht, wordt een wachtthread geselecteerd. Ga niet uit van een FIFO-volgorde (first-in, first-out). Externe gebeurtenissen, zoals kernelmodus-API's, kunnen de wachtvolgorde wijzigen.
Nadat een thread het eigendom van een mutex heeft verkregen, kan deze dezelfde mutex opgeven in herhaalde aanroepen naar de wachtfuncties zonder de uitvoering ervan te blokkeren. Hiermee voorkomt u dat een thread zichzelf blokkeert terwijl wordt gewacht op een mutex die al eigenaar is. Om het eigendom ervan onder dergelijke omstandigheden vrij te geven, moet de thread ReleaseMutex één keer aanroepen voor elke keer dat de mutex aan de voorwaarden van een wachtfunctie voldoet.
Als een thread wordt beëindigd zonder het eigendom van een mutex-object vrij te geven, wordt het mutex-object beschouwd als afgebroken. Een wachtthread kan het eigendom verkrijgen van een verlaten mutex-object, maar de wachtfunctie retourneert WAIT_ABANDONED om aan te geven dat het mutex-object wordt verlaten. Een verlaten mutex-object geeft aan dat er een fout is opgetreden en dat een gedeelde resource die wordt beveiligd door het mutex-object, een niet-gedefinieerde status heeft. Als de thread doorgaat alsof het mutex-object niet is verlaten, wordt het niet langer beschouwd als verlaten nadat de thread het eigendom ervan vrijgeeft. Hiermee herstelt u normaal gedrag als een ingang naar het mutex-object vervolgens wordt opgegeven in een wachtfunctie.
Houd er rekening mee dat kritieke sectieobjecten synchronisatie bieden die vergelijkbaar is met die van mutex-objecten, behalve dat kritieke sectieobjecten alleen kunnen worden gebruikt door de threads van één proces.
Verwante onderwerpen