Поделиться через


Мьютексы

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

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

Используйте мьютексы

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

Чтобы освободить мьютекс, поток вызывает его метод ReleaseMutex. У мьютексов есть привязка к потоку; то есть мьютекс может быть освобожден только тем потоком, которому он принадлежит. Если поток освобождает мьютекс, которым он не владеет, ApplicationException выбрасывается в этом потоке.

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

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

Заброшенные мьютекси

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

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

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

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

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

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

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

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

Замечание

Безопасность управления доступом для системных мьютексов доступна только в .NET Framework, она недоступна в .NET Core или .NET 5+.

См. также