Ваш пример испытывает условия гонки.Вам действительно нужно что-то подобное условным переменным.Невозможно использовать только семафоры, чтобы гарантировать, что несколько производителей не записывают в полный буфер или что несколько потребителей не читают из пустого буфера.
Модель с одним производителем и одним потребителем просто блокирует потребителя до тех пор, покапроизводитель действует, затем блокирует производителя, пока не действует потребитель.Нет никаких указаний, если общий буфер пуст или заполнен.Обратите внимание, что число семафоров не совпадает с полным или пустым состоянием буфера.