Вызов, когда он равен 0, не должен работать. Вызов, когда это 3 работает. (Я думаю о Java).
Позвольте мне добавить еще. Многие люди думают о блокировках, подобных (двоичным) семафорам (то есть - N = 1, поэтому значение семафора равно 0 (удерживается) или 1 (не удерживается)). Но это не совсем верно. В замке есть понятие «владение», поэтому он может быть «повторно входящим». Это означает, что потоку, который содержит блокировку, разрешено снова вызывать lock () (эффективно перемещая счетчик от 0 до -1), поскольку поток уже удерживает блокировку и ему разрешено «повторно вводить» ее. Замки также могут быть не реентерабельными. Ожидается, что держатель блокировки будет вызывать unlock () столько же раз, сколько и lock ().
Семафоры не имеют понятия собственности, поэтому они не могут быть повторно введены, хотя может быть получено столько разрешений, сколько доступно. Это означает, что поток должен блокироваться, когда он встречает значение 0, пока кто-то не увеличит семафор.
Кроме того, в том, что я видел (это Java), вы можете увеличить семафор больше, чем N, и это также как-то связано с владением: у семафора нет понятия владения, поэтому любой может дать ему больше разрешений , В отличие от потока, где всякий раз, когда поток вызывает unlock () без удержания блокировки, это ошибка. (В Java это будет исключение).
Надеюсь, этот способ мышления поможет.