Share via


Mutexes

U kunt een Mutex object gebruiken om exclusieve toegang tot een resource te bieden. De Mutex klasse gebruikt meer systeemresources dan de Monitor klasse, maar kan worden ge marshalld over de grenzen van het toepassingsdomein, kan worden gebruikt met meerdere wachttijden en kan worden gebruikt om threads in verschillende processen te synchroniseren. Zie Overzicht van Synchronisatieprimitief voor een vergelijking van beheerde synchronisatiemechanismen.

Zie de referentiedocumentatie voor de Mutex constructors voor codevoorbeelden.

Mutexes gebruiken

Een thread roept de WaitOne methode van een mutex aan om eigendom aan te vragen. De aanroep blokkeert totdat de mutex beschikbaar is of totdat het optionele time-outinterval is verstreken. De status van een mutex wordt gesignaleerd als er geen thread eigenaar van is.

Een thread brengt een mutex vrij door de ReleaseMutex bijbehorende methode aan te roepen. Mutexes hebben threadaffiniteit; Dat wil zeggen dat de mutex alleen kan worden vrijgegeven door de thread die eigenaar is van de mutex. Als een thread een mutex vrijgeeft die niet de eigenaar is, wordt er een ApplicationException in de thread gegenereerd.

Omdat de Mutex klasse is afgeleid van WaitHandle, kunt u ook de statische WaitAll of WaitAny methoden WaitHandle aanroepen om het eigendom van een Mutex in combinatie met andere wachtgrepen aan te vragen.

Als een thread eigenaar is van een Mutexthread, kan die thread hetzelfde Mutex opgeven in herhaalde wachtaanvraag-aanroepen zonder de uitvoering ervan te blokkeren. De thread moet echter zo Mutex vaak het eigendom vrijgeven om het eigendom vrij te geven.

Verlaten mutexes

Als een thread wordt beƫindigd zonder een Mutexvrij te geven, wordt de mutex naar verwachting afgebroken. Dit duidt vaak op een ernstige programmeerfout omdat de resource die de mutex beveiligt, mogelijk in een inconsistente status blijft. Er AbandonedMutexException wordt een gegenereerd in de volgende thread die de mutex verkrijgt.

In het geval van een systeembrede mutex kan een verlaten mutex erop wijzen dat een toepassing plotseling is beƫindigd (bijvoorbeeld met Behulp van Windows Taakbeheer).

Lokale en systeemmutexes

Mutexes zijn van twee typen: lokale mutexes en benoemde systeemmutexes. Als u een Mutex object maakt met behulp van een constructor die een naam accepteert, wordt het gekoppeld aan een besturingssysteemobject van die naam. Benoemde systeemmutexes zijn zichtbaar in het hele besturingssysteem en kunnen worden gebruikt om de activiteiten van processen te synchroniseren. U kunt meerdere Mutex objecten maken die dezelfde benoemde systeemmutex vertegenwoordigen en u kunt de OpenExisting methode gebruiken om een bestaande benoemde systeemmutex te openen.

Er bestaat alleen een lokale mutex binnen uw proces. Het kan worden gebruikt door elke thread in uw proces die een verwijzing naar het lokale Mutex object heeft. Elk Mutex object is een afzonderlijke lokale mutex.

Toegangsbeheerbeveiliging voor systeemmutexes

.NET Framework biedt de mogelijkheid om query's uit te voeren en windows-toegangsbeheerbeveiliging in te stellen voor benoemde systeemobjecten. Het beveiligen van systeemmutexes vanaf het moment van maken wordt aanbevolen omdat systeemobjecten globaal zijn en daarom kunnen worden vergrendeld door andere code dan uw eigen.

Zie voor informatie over de beveiliging van toegangsbeheer voor mutexes de MutexSecurity klassen MutexAccessRule , de MutexRights opsomming, de GetAccessControl, SetAccessControlen OpenExisting methoden van de Mutex klasse en de Mutex(Boolean, String, Boolean, MutexSecurity) constructor.

Notitie

Beveiliging van toegangsbeheer voor systeemmutexes is alleen beschikbaar met .NET Framework, het is niet beschikbaar met .NET Core of .NET 5+.

Zie ook