Mutex – třídy

Objekt můžete použít Mutex k poskytnutí výhradního přístupu k prostředku. Třída Mutex používá více systémových prostředků než Monitor třída, ale může být zařazována přes hranice domény aplikace, lze ji použít s více čekáními a lze ji použít k synchronizaci vláken v různých procesech. Porovnání mechanismů spravované synchronizace najdete v tématu Přehled primitiv synchronizace.

Příklady kódu najdete v referenční dokumentaci pro Mutex konstruktory.

Použití mutexů

Vlákno volá WaitOne metodu mutex pro vyžádání vlastnictví. Volání blokuje, dokud není k dispozici mutex, nebo dokud nepovinný interval časového limitu uplynou. Stav mutexu je signalován, pokud ho žádné vlákno nevlastní.

Vlákno uvolní mutex voláním jeho ReleaseMutex metody. Mutexy mají spřažení vláken; to znamená, že mutex může být uvolněn pouze vláknem, které ho vlastní. Pokud vlákno uvolní mutex, který nevlastní, ApplicationException vyvolá se ve vlákně.

Vzhledem k tomu, že Mutex třída je odvozena od WaitHandle, můžete také volat statické WaitAll nebo WaitAny metody WaitHandle vyžádání vlastnictví Mutex v kombinaci s jinými obslužnými rutinami čekání.

Pokud vlákno vlastní Mutex, toto vlákno může zadat stejné Mutex při opakovaných voláních požadavků čekání bez blokování jeho spuštění, ale musí uvolnit Mutex tolikrát, kolikrát má uvolnit vlastnictví.

Opuštěné mutexy

Pokud se vlákno ukončí bez uvolnění Mutex, mutex se říká, že je opuštěn. To často značí závažnou chybu programování, protože prostředek, který chrání mutex, může zůstat v nekonzistentním stavu. Vyvolá se AbandonedMutexException v dalším vlákně, které získá mutex.

V případě mutexu celého systému může opuštěný mutex znamenat, že aplikace byla náhle ukončena (například pomocí Správce úloh systému Windows).

Místní a systémové mutexy

Mutexy mají dva typy: místní mutexy a pojmenované systémové mutexy. Pokud vytvoříte Mutex objekt pomocí konstruktoru, který přijímá název, je přidružen k objektu operačního systému tohoto názvu. Pojmenované systémové mutexy jsou viditelné v celém operačním systému a lze je použít k synchronizaci aktivit procesů. Můžete vytvořit více Mutex objektů, které představují stejný pojmenovaný systémový mutex, a můžete použít metodu OpenExisting k otevření existující pojmenované systémové mutex.

Místní mutex existuje pouze v rámci vašeho procesu. Může ho použít libovolné vlákno v procesu, které má odkaz na místní Mutex objekt. Každý Mutex objekt je samostatný místní mutex.

Zabezpečení řízení přístupu pro systémové mutexy

Rozhraní .NET Framework poskytuje možnost dotazování a nastavení zabezpečení řízení přístupu systému Windows pro pojmenované systémové objekty. Ochrana mutexů systému od okamžiku vytvoření se doporučuje, protože systémové objekty jsou globální, a proto je možné je uzamknout jiným kódem než vaším vlastním.

Informace o zabezpečení řízení přístupu pro mutexy, viz a MutexSecurityMutexAccessRule třídy, MutexRights výčet, GetAccessControl, SetAccessControl, a OpenExisting metody Mutex třídy a konstruktoru Mutex(Boolean, String, Boolean, MutexSecurity) .

Poznámka:

Zabezpečení řízení přístupu pro systémové mutexy je k dispozici pouze v rozhraní .NET Framework, není k dispozici pro .NET Core nebo .NET 5 nebo novější.

Viz také