Udostępnij za pośrednictwem


Obiekty Mutex

Obiekt mutex jest obiektem synchronizacji, którego stan jest ustawiony na sygnał, gdy nie jest własnością żadnego wątku i niepodpisany, gdy jest własnością. Tylko jeden wątek jednocześnie może być właścicielem obiektu mutex, którego nazwa pochodzi z faktu, że jest przydatna do koordynowania wzajemnie wykluczającego się dostępu do udostępnionego zasobu. Na przykład, aby zapobiec zapisywaniu dwóch wątków w pamięci udostępnionej w tym samym czasie, każdy wątek czeka na własność obiektu mutex przed wykonaniem kodu, który uzyskuje dostęp do pamięci. Po zapisaniu do pamięci udostępnionej wątek zwalnia obiekt mutex.

Wątek używa funkcji CreateMutex lub CreateMutexEx w celu utworzenia obiektu mutex. Wątek tworzący może zażądać natychmiastowej własności obiektu mutex, a także określić nazwę obiektu mutex. Może również utworzyć nienazwany mutex. Aby uzyskać dodatkowe informacje o nazwach obiektów mutex, event, semaphore i timer, zobacz Interprocess Synchronization.

Wątki w innych procesach mogą otwierać dojście do istniejącego obiektu mutex o nazwie, określając jego nazwę w wywołaniu funkcji OpenMutex. Aby przekazać uchwyt do nienazwanych mutex do innego procesu, użyj funkcji DuplicateHandle lub dziedziczenia obsługi nadrzędny-podrzędny.

Każdy wątek z uchwytem do obiektu mutex może używać jednej z funkcji oczekiwania żądać własności obiektu mutex. Jeśli obiekt mutex jest własnością innego wątku, funkcja wait blokuje żądany wątek, dopóki wątek będący właścicielem zwalnia obiekt mutex przy użyciu funkcji ReleaseMutex. Wartość zwracana funkcji wait wskazuje, czy funkcja została zwrócona z jakiegoś powodu innego niż stan ustawionego mutexu na sygnał.

Jeśli na mutex czeka więcej niż jeden wątek, zostanie wybrany wątek oczekiwania. Nie należy zakładać kolejności pierwszy na wyjścia (FIFO). Zdarzenia zewnętrzne, takie jak interfejsy API trybu jądra, mogą zmieniać kolejność oczekiwania.

Gdy wątek uzyska własność mutexu, może określić ten sam mutex w powtarzających się wywołaniach funkcji oczekiwania bez blokowania wykonywania. Zapobiega to zakleszczaniu wątku podczas oczekiwania na mutex, który jest już właścicielem. Aby zwolnić własność w takich okolicznościach, wątek musi wywołać ReleaseMutex raz za każdym razem, gdy mutex spełnia warunki funkcji wait.

Jeśli wątek kończy się bez zwalniania własności obiektu mutex, obiekt mutex jest uznawany za porzucony. Wątek oczekiwania może uzyskać własność opuszczonego obiektu mutex, ale funkcja wait zwróci WAIT_ABANDONED, aby wskazać, że obiekt mutex jest porzucony. Porzucony obiekt mutex wskazuje, że wystąpił błąd i że wszystkie współużytkowane zasoby chronione przez obiekt mutex są w stanie niezdefiniowanym. Jeśli wątek będzie kontynuowany tak, jakby obiekt mutex nie został porzucony, nie jest już uważany za porzucony po tym, jak wątek zwalnia jego własność. Spowoduje to przywrócenie normalnego zachowania, jeśli dojście do obiektu mutex zostanie następnie określone w funkcji wait.

Należy pamiętać, że obiekty sekcji krytycznej zapewnić synchronizację podobną do tej dostarczonej przez obiekty mutex, z wyjątkiem tego, że krytyczne obiekty sekcji mogą być używane tylko przez wątki pojedynczego procesu.

przy użyciu obiektów Mutex