Mutex
Рекурсивная блокировка совместно используемых данных.
Все участники должны защищать одни и те же данные одним Mutex. После Lock() или успешного TryLock() выполните Unlock() в finally. Повторный захват тем же потоком разрешён и требует отдельного освобождения каждого уровня.
Не держите mutex во время WaitToFinish() или ожидания события, которое должен произвести заблокированный worker. Mutex не предоставляет timeout, отмену или обещание справедливого порядка. Потокобезопасные API. Проверены обычный/повторный захват и contention на Windows; стресс и неверный unlock не выполнялись.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
MutexКонструктор
public Mutex();Создаёт рекурсивный mutex движка. Он защищает только участок, где все участники используют один экземпляр и одинаковый протокол. Не делает весь Resource или EntityTree потокобезопасным. Не Dispose захваченный mutex или объект, который ещё используют workers.
Методы3
Lockvoid
public void Lock();Захватывает mutex, блокируя вызывающий поток при чужом владельце. Тот же поток может захватить повторно; каждый успешный захват требует своего Unlock. Освобождайте в finally. Не держите блокировку во время join/ожидания, если worker должен захватить её для завершения. У метода нет timeout или CancellationToken.
TryLockbool
public bool TryLock();Пытается захватить без блокирующего ожидания. True означает реальный захват, включая повторный захват владельцем: нужен соответствующий Unlock. False при занятом другим потоком mutex не является ошибкой. Не превращайте повторные TryLock в бесконечный busy loop главного потока.
boolTrue с приобретённым захватом либо false без захвата.
Unlockvoid
public void Unlock();Снимает один уровень захвата текущего владельца. Вызывайте ровно для соответствующего успешного Lock/TryLock, из того же потока. Не является общим reset и не позволяет освободить чужой mutex. Ошибочный unlock не выполнялся в QA.