4.3. Ограниченный буфер
Я приведу последний пример для иллюстрации использования общего семафора. В ¬4.1 мы изучали производителя и потребителя, связанных через буфер неограниченной емкости. Это типичное одностороннее ограничение: производитель может находиться сколь угодно впереди потребителя; однако потребитель никогда не может быть впереди производителя. Их отношения становятся симметричными, если они связываются через буфер ограниченной емкости, скажем в N порций. Программа дается без обсуждения; читателю предоставляется убедиться в ее полной симметрии. ("Потребитель производит, а производитель потребляет пустые порции в буфере".) Значение N, так же, как и буфер, предполагаются определенными во внешних блоках.
begin integer число порций в буфере, число пустых позиций, работа с буфером; число порций в буфере := 0; число пустых позиций := N; работа с буфером := 1; parbegin
производитель: begin
снова 1: производство новой порции; P(число пустых позиций); P(работа с буфером); добавление порции к буферу; V(работа с буфером); V(число порций в буфере); goto снова 1; end; потребитель: begin
снова 2: P(число порций в буфере); P(работа с буфером); взятие порции из буфера; V(работа с буфером); V(число пустых позиций); обработка взятой порции; goto снова 2; end
parend
end