Да, как написано, take()
будет пробуждать случайно выбранный поток из заблокированных в release()
, а release()
будет ожидать вызова take()
, если signal
ложно при входе. Это говорит о том, что у вас есть имена take()
и release()
в обратном направлении: take()
должен быть блокирующим вызовом.
Это двоичный семафор, так как он имеет только два состояния. Если вы используете его как мьютекс, вам понадобится пара take()
- release()
, заключающая в себе код, который необходимо изолировать. Однако в этом случае вам лучше использовать простой мьютекс.
Семафоры имеют много применений (см. «Маленькая книга семафоров»), но, как правило, их сложнее правильно использовать, чем мьютексы и мониторы / переменные условий.