Объекты мьютекса
Объект мьютекса — это объект синхронизации, состояние которого устанавливается для сигнала, когда оно не принадлежит ни одному потоку, и незначен при его собственности. Только один поток в то время может принадлежать объекту мьютекса, имя которого исходит от того факта, что оно полезно для координации взаимоисключающего доступа к общему ресурсу. Например, чтобы предотвратить запись двух потоков в общую память одновременно, каждый поток ожидает владения объектом мьютекса перед выполнением кода, который обращается к памяти. После записи в общую память поток освобождает объект мьютекса.
Поток использует функцию CreateMutex CreateMutex или CreateMutexEx для создания объекта мьютекса. Создание потока может запрашивать немедленное владение объектом мьютекса, а также указать имя объекта мьютекса. Он также может создать неименованный мьютекс. Дополнительные сведения о именах для объектов мьютекса, событий, семафора и таймера см. в синхронизации межпроцессных операций.
Потоки в других процессах могут открывать дескриптор существующему объекту с именем мьютекса, указав его имя в вызове функции OpenMutex. Чтобы передать дескриптор неименованному мьютексу другому процессу, используйте функцию дубликата Или наследование родительского дочернего дескриптора.
Любой поток с дескриптором объекта мьютекса может использовать одну из функций ожидания для запроса владения объектом мьютекса. Если объект мьютекса принадлежит другому потоку, функция ожидания блокирует запрашивающий поток, пока принадлежащий поток не освобождает объект мьютекса с помощью функции ReleaseMutex. Возвращаемое значение функции ожидания указывает, возвращается ли функция по какой-либо причине, отличной от состояния мьютекса, заданного для сигнала.
Если несколько потоков ожидают мьютекса, выбран поток ожидания. Не предполагайте порядок первого входа (FIFO). Внешние события, такие как API режима ядра, могут изменить порядок ожидания.
После того как поток получает владение мьютексом, он может указать один и тот же мьютекс в повторяющихся вызовах функции ожидания без блокировки его выполнения. Это предотвращает взаимоблокировку потока во время ожидания мьютекса, которому он уже владеет. Чтобы освободить свое владение в таких обстоятельствах, поток должен вызывать ReleaseMutex один раз, когда мьютекс удовлетворяет условиям функции ожидания.
Если поток завершается без освобождения его владения объектом мьютекса, то объект мьютекса считается заброшенным. Ожидающий поток может получить владение заброшенным объектом мьютекса, но функция ожидания вернет WAIT_ABANDONED, чтобы указать, что объект мьютекса заброшен. Заброшенный объект мьютекса указывает, что произошла ошибка и что любой общий ресурс, защищенный объектом мьютекса, находится в неопределенном состоянии. Если поток продолжается, как будто объект мьютекса не был оставлен, он больше не считается заброшенным после того, как поток освобождает свою собственность. Это восстанавливает нормальное поведение, если дескриптор объекта мьютекса впоследствии указан в функции ожидания.
Обратите внимание, что критически важные объекты разделов обеспечить синхронизацию, аналогичную той, которая предоставляется объектами мьютекса, за исключением того, что критически важные объекты разделов могут использоваться только потоками одного процесса.
Связанные разделы