Объекты Mutex

Обновлен: Ноябрь 2007

Можно использовать объект Mutex для предоставления монопольного доступа к ресурсу. Класс Mutex использует больше системных ресурсов, чем класс Monitor, однако он может маршалироваться через границы домена приложения, использоваться с несколькими ожиданиями, а также использоваться для синхронизации потоков в различных процессах. Сравнение управляемых механизмов синхронизации см. в разделе Обзор примитивов синхронизации.

Примеры кода см. в справочной документации для конструкторов Mutex.

Использование мьютексов

Поток вызывает метод WaitOne мьютекса для запроса изменения владельца. Вызов блокирует поток до того момента, как мьютекс станет доступным, или пока не истечет дополнительное время ожидания. Если мьютекс не используется ни одним из потоков, он находится в свободном состоянии.

Поток освобождает мьютекс путем вызова метода ReleaseMutex. Мьютексы поддерживают сходство потоков; то есть мьютекс может быть освобожден только потоком, который владеет этим мьютексом. Если поток освобождает мьютекс, которым не владеет, в потоке создается исключение ApplicationException.

Так как класс Mutex является производным из WaitHandle, можно вызвать статические методы WaitAll или WaitAny класса WaitHandle для запроса изменения владельца объекта Mutex в комбинации с другими дескрипторами ожидания.

Если Mutex используется потоком, этот поток может указывать тот же объект Mutex при повторном вызове запроса-ожидания, не прерывая выполнения. Для отказа от использования объекта Mutex его нужно освободить соответствующее количество раз.

Брошенные мьютексы

Если поток прерывается без освобождения Mutex, мьютекс называется брошенным. Это часто указывает на серьезную ошибку при программировании, так как ресурс, защищаемый мьютексом, может остаться в несогласованном состоянии. В .NET Framework версии 2.0 исключение AbandonedMutexException в следующем потоке, который получает мьютекс.

hw29w7t1.alert_note(ru-ru,VS.90).gifПримечание.

В .NET Framework версии 1.0 и 1.1 состояние брошенного Mutex задается как сигнальное и владельцем становится следующий ожидающий поток. Если нет ни одного ожидающего потока, Mutex остается в сигнальном состоянии. Исключение не создается.

Брошенный системный мьютекс может свидетельствовать о внезапном прекращении выполнения приложения (например, с помощью диспетчера задач Windows).

Локальные и системные мьютексы

Мьютексы бывают двух типов: локальные мьютексы и именованные системные мьютексы. При создании объекта Mutex с помощью конструктора, позволяющего передавать параметр с именем объекта, объект связывается с имеющим данное имя объектом операционной системы. Именованные системные мьютексы доступны в пределах всей операционной системы и могут быть использованы для синхронизации действий процессов. Можно создать несколько объектов Mutex, представляющих один и тот же именованный системный мьютекс, и использовать метод OpenExisting для открытия существующего именованного системного мьютекса.

Локальный мьютекс существует только внутри одного процесса. Он может использоваться любым потоком в процессе, имеющим ссылку на локальный объект Mutex. Каждый объект Mutex является отдельным локальным мьютекс.

Безопасность управления доступом для системных мьютексов

В .NET Framework версии 2.0 предоставляется возможность запроса и установки безопасности управления доступом Windows для именованных системных объектов. Рекомендуется защищать системные мьютексы с момента создания, потому что системные объекты являются глобальными и поэтому могут быть заблокированы посторонним кодом.

Сведения о безопасности управления доступом для мьютексов см. в классах MutexSecurity и MutexAccessRule, перечислении MutexRights, методах GetAccessControl, SetAccessControl и OpenExisting класса Mutex и в конструкторе Mutex(Boolean, String, Boolean%, MutexSecurity).

См. также

Основные понятия

Мониторы

Потоки и работа с потоками

Ссылки

Mutex

Mutex

MutexSecurity

MutexAccessRule

Другие ресурсы

Управляемая поточность

Объекты и функциональные возможности работы с потоками