Может ли поток вызвать.WaitOne() Mutex более одного раза, прежде чем вызывать.ReleaseMutex() и наоборот?
В моем коде было бы удобно, если бы мой поток вызывал.WaitOne() более одного раза перед вызовом.ReleaseMutex().
И наоборот: вызов.ReleaseMutex () несколько раз перед перезапуском цикла, который начинается с вызова.WaitOne().
Некоторые комбинации операционных систем и компиляторов позволяют это. Некоторые нет.
1 ответ
Mutex имеет только 2 состояния: заблокировано или разблокировано. Его нельзя заблокировать дважды или разблокировать дважды. То, что вы хотите, это семафор: смотрите здесь. Семафор имеет счетчик и после каждого WaitOne
Счетчик уменьшается на 1, а после каждого звонка Release
Счетчик увеличивается на 1.
Сеть System.Threading.Mutex
Класс использует объект мьютекса ядра Win32, который является повторно входящим. Следующее примечание из документации объясняет правильное использование:
Поток, которому принадлежит мьютекс, может запрашивать тот же мьютекс при повторных вызовах
WaitOne
без блокировки его исполнения. Тем не менее, поток должен вызватьReleaseMutex
метод столько же раз, чтобы освободить владельца мьютекса.
Понятно, что ОС подсчитывает, сколько раз был введен мьютекс - это НЕ двоичное состояние "заблокировано или разблокировано" (кроме счетчика есть дополнительное состояние "заброшено").