Sdílet prostřednictvím


Mutexy

Objekt Mutex můžete použít 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 zavolá metodu WaitOne mutexu, aby si vyžádalo vlastnictví. Volání blokuje, dokud není k dispozici mutex, nebo dokud neuplyne nepovinný časový interval. Stav mutexu je signalován, pokud ho žádné vlákno nevlastní.

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

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

Pokud vlákno vlastní Mutex, může toto vlákno zadat stejné Mutex při opakovaných čekacích požadavcích, aniž by došlo k blokování jeho spuštění; jeho vlastnictví však vyžaduje, aby vlákno uvolnilo Mutex stejný početkrát.

Opuštěné mutexy

Pokud se vlákno ukončí bez uvolnění Mutex, dojde k opuštění mutexu. 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 objektů Mutex, které představují stejný pojmenovaný systémový mutex, a pomocí metody OpenExisting můžete otevřít 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 naleznete u tříd MutexSecurity a MutexAccessRule, výčtu MutexRights, metod GetAccessControl, SetAccessControl a OpenExisting třídy Mutex 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é