Семафор работает следующим образом ...
proc a: "Доступен ли ресурс?" семафор = -2 Да. семафор ++
proc b: "Является ли ресурс ..." semaphore = -1 Да. семафор ++
proc c: "is the resource ..." semaphore = 0 No. (ничего не происходит)
на данный момент proc c может поставить в очередь (в зависимости от вашего API это может быть занятый цикл или обратный вызов, или вы можете просто создать ожидающий поток и написать свой собственный обратный вызов)
proc a: семафор "im done" -;
proc c заметит, что семафор доступен через что-то похожее на то, что я упоминал ранее.
причина, по которой я написал все это, так что я могу сказать, что оба. Это похоже на очередь сообщений, в которой у вас могут быть потоки, ожидающие на ресурсе (совместно используемой памяти, управляемой семафором), которые инициируют некоторое действие, даже реальное системное сообщение, когда они получают ресурс. Или вы могли бы просто быть заняты - подождать, пока это не будет сделано, и это было бы как трубка.