Может ли поток вызвать .WaitOne () Mutex более одного раза, прежде чем вызывать .ReleaseMutex () и наоборот? - PullRequest
0 голосов
/ 16 мая 2018

В моем коде было бы удобно, если бы мой поток вызывал .WaitOne () более одного раза перед вызовом .ReleaseMutex ().

И наоборот: несколько раз вызывал .ReleaseMutex () перед перезапускомцикл, который начинается с вызова .WaitOne ().

Некоторые комбинации операционных систем / компилятора позволяют это.Некоторые нет.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

.NET System.Threading.Mutex класс использует объект мьютекса ядра Win32, который является повторно входящим.Следующее примечание в документации объясняет правильное использование:

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

Очевидно, ОС подсчитывает количество попыток ввода мьютекса - этоНЕ является бинарным состоянием «заблокирован или разблокирован» (помимо счетчика есть дополнительное состояние «заброшен»).

0 голосов
/ 16 мая 2018

Mutex имеет только 2 состояния: заблокировано или разблокировано. Его нельзя заблокировать дважды или разблокировать дважды. Вам нужен семафор: Смотрите здесь . У семафора есть счетчик, и после каждого WaitOne счетчик уменьшается на 1, а после каждого вызова Release счетчик увеличивается на 1.

...