Udostępnij za pośrednictwem


Muteksy

Możesz użyć Mutex obiektu, aby zapewnić wyłączny dostęp do zasobu. Klasa Mutex używa większej ilości zasobów systemowych niż Monitor klasa, ale można ją rozmieścić w granicach domeny aplikacji, można jej używać z wieloma oczekiwaniami i 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 udostępnienia mutexu lub do czasu upływu opcjonalnego interwału limitu czasu. Stan mutexu jest sygnalizowany, jeśli żaden wątek nie jest jego właścicielem.

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

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

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

Porzucone elementy muteksowe

Jeśli wątek kończy się bez zwalniania Mutex, mutex mówi się, że zostanie 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 elementy muteksowe

Mutexes są dwóch typów: lokalne mutexes i nazwane mutexes systemu. 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 system mutex i użyć OpenExisting metody , aby otworzyć istniejący nazwany mutex systemu.

Lokalny mutex istnieje tylko w ramach 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 mutexes, zobacz MutexSecurity klasy iMutexAccessRule, MutexRights wyliczenie, GetAccessControlmetody Mutex , SetAccessControli OpenExisting klasy i konstruktoraMutex(Boolean, String, Boolean, MutexSecurity).

Uwaga

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 też