Udostępnij za pośrednictwem


Mutexes

Możesz użyć Mutex obiektu, aby zapewnić wyłączny dostęp do zasobu. Klasa Mutex zużywa więcej zasobów systemowych niż klasa Monitor, ale można ją przekazywać w granicach domen aplikacji, można jej używać z wieloma czekaniami oraz może służyć do synchronizowania wątków w różnych procesach. Aby zapoznać się z porównaniem zarządzanych mechanizmów synchronizacji, zobacz Omówienie elementów pierwotnych synchronizacji.

Przykłady kodu można znaleźć w dokumentacji referencyjnej Mutex konstruktorów.

Korzystanie z mutexes

Wątek wywołuje WaitOne metodę mutex w celu żądania własności. Wywołanie blokuje się do momentu, aż muteks będzie dostępny, lub aż do upłynięcia opcjonalnego limitu czasowego. Stan mutexu jest sygnalizowany, jeśli żaden wątek nie jest jego właścicielem.

Wątek zwalnia mutex, wywołując metodę ReleaseMutex. Mutex ma afinitet wątków; oznacza to, że mutex można zwolnić tylko przez wątek, którego jest właścicielem. Jeśli wątek zwalnia mutex, który nie jest właścicielem, element ApplicationException jest zgłaszany w wątku.

Ponieważ klasa pochodzi z Mutex, można również wywołać statyczne metody WaitHandle lub WaitAllWaitAny, aby żądać własności obiektu WaitHandle w połączeniu z innymi uchwytami oczekiwania.

Jeśli wątek jest właścicielem Mutex, ten wątek może określać to samo Mutex w powtarzających się żądaniach oczekiwania bez blokowania jego wykonywania; jednak musi zwolnić Mutex tyle razy, ile razy posiadał własność.

Porzucone elementy muteksowe

Jeśli wątek kończy się, nie zwalniając Mutex, mutex uważa się za porzucony. Często oznacza to poważny błąd programowania, ponieważ zasób, który chroni mutex, może pozostać w stanie niespójnym. Element AbandonedMutexException jest zgłaszany w następnym wątku, który uzyskuje mutex.

W przypadku mutexu całego systemu porzucony mutex może wskazywać, że aplikacja została nagle zakończona (na przykład przy użyciu Menedżera zadań systemu Windows).

Lokalne i systemowe muteksy

Muteksy są dwóch typów: lokalne muteksy i nazwane muteksy systemowe. Jeśli utworzysz obiekt przy użyciu konstruktora Mutex , który akceptuje nazwę, jest skojarzony z obiektem systemu operacyjnego tej nazwy. Nazwane mutexy systemu są widoczne w całym systemie operacyjnym i mogą służyć do synchronizowania działań procesów. Można utworzyć wiele Mutex obiektów reprezentujących ten sam nazwany systemowy mutex i użyć metody OpenExisting do otwarcia istniejącego nazwanego mutexu systemowego.

Lokalny mutex istnieje tylko w ramach twojego procesu. Może być używany przez dowolny wątek w procesie, który zawiera odwołanie do obiektu lokalnego Mutex . Każdy Mutex obiekt jest oddzielnym lokalnym mutexem.

Zabezpieczenia kontroli dostępu dla systemów mutexes

Program .NET Framework umożliwia wykonywanie zapytań i ustawianie zabezpieczeń kontroli dostępu systemu Windows dla nazwanych obiektów systemowych. Ochrona muteksów systemowych od momentu utworzenia jest zalecana, ponieważ obiekty systemowe są globalne i dlatego mogą być blokowane przez kod inny niż własny.

Aby uzyskać informacje na temat zabezpieczeń kontroli dostępu dla mutexów, zobacz klasy MutexSecurity i MutexAccessRule, wyliczenie MutexRights, metody GetAccessControl, SetAccessControl i OpenExisting klasy Mutex oraz konstruktor Mutex(Boolean, String, Boolean, MutexSecurity).

Uwaga / Notatka

Zabezpieczenia kontroli dostępu dla systemów mutexes są dostępne tylko w programie .NET Framework, nie są dostępne w programie .NET Core lub .NET 5+.

Zobacz także