Семахор (мьютекс) инициализируется равным 1. Только один поток может получить эту единицу, все остальные блокируются.Его единственной целью является предотвращение доступа к очереди более чем одного потока любого типа и, таким образом, обеспечение того, чтобы типичная реализация очереди была поточно-ориентированной.
Один семафор (полный) инициализируется нулем и считаетсяколичество элементов в очереди.
Один семафор (пустой), инициализируется до длины очереди и подсчитывает количество свободных мест в очереди.
Вот и все.Чтобы включить объект, сначала подождите (пусто), чтобы убедиться, что есть свободное место, затем подождите (мьютекс), чтобы получить доступ к очереди, нажмите на объект (да, всегда будет свободное место -нет необходимости проверять счетчик очереди), сигнал (мьютекс), чтобы разблокировать очередь, и, наконец, сигнал (полный), чтобы любой потребительский поток, который ожидает или позже появится, мог получить модуль, представляющий объект в очереди.
Чтобы отключить объект, сначала подождите (полный), чтобы убедиться, что объект доступен в очереди, затем подождите (мьютекс), чтобы получить доступ к очереди, выдвиньте объект, (да, в очереди всегда будет объект - нет необходимости проверять счетчик очереди), сигнал (мьютекс), чтобы разблокировать очередь, и, наконец, сигнал (пустой), чтобы любой поток производителя, который ожидает или позже включится,может получить блок, представляющий свободное место в очереди.
Это материал Computer Science 101 - абсолютно классическая очередь блокировки производителя-потребителя.