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