На этом шаге мы рассмотрим задачу о производителе/потребителе.
В задаче о производителе/потребителе также присутствует совместно используемый объект, но в этом случае разделяемый объект точно определен и является буфером. Процесс-производитель создает объекты, которые помещаются в буфер. Потребитель ждет, пока объект не будет помещен в буфер, удаляет его оттуда и использует. Такая ситуация может быть промоделирована сетью Петри так, как показано на рисунке 1. Позиция B представляет собой буфер, каждая фишка соответствует элементу данных, который произведен, но еще не использован.
Рис.1. Задача о производителе/потребителе, моделируемая сетью Петри
Один из вариантов этой задачи - это задача о нескольких производителях/потребителях. В этом случае несколько производителей порождают элементы данных, помещаемые в общий буфер, для нескольких потребителей. На рисунке 2 представлено решение этой задачи в виде сети Петри.
Рис.2. Задача о нескольких производителях/потребителях
Эта сеть совпадает с сетью на рисунке 1, за исключением того, что представления s производителей и t потребителей мы начали выполнение сети с s фишками в начальной позиции процесса-производителя и t фишками в начальной позиции процесса-потребителя. Таким образом, мы представляем s производителей и t потребителей, реализуемых совместно используемыми программами. Альтернативой было бы дублирование программного кода для процессов производителя и потребителя, однако, результатом этого при том же самом поведении была бы гораздо большая сеть.
В другом варианте задачи о производителе/потребителе используется буфер ограниченного размера. При такой постановке задачи буфер между производителем и потребителем ограничен, т.е. имеет только n ячеек для элементов данных. Производитель не может постоянно работать с той скоростью, которая ему нужна, а вынужден ждать, если потребитель работает медленно и буфер заполнен. На рисунке 3 показано решение этой проблемы.
Рис.3. Задача о производителе/потребителе с ограниченным буфером
Ограниченному буферу сопоставляется две позиции: B представляет количество элементов данных, которые произведены, но еще не использованы (число заполненных ячеек), B' - количество пустых ячеек в буфере. Первоначально B' имеет n фишек, а B фишек не имеет. Если буфер заполнен, то B' фишек не имеет, а B имеет n фишек. Если теперь производитель попытается поместить еще один элемент данных в буфер, то он будет остановлен, так как в B' нет фишки, делающей этот переход разрешенным.
На следующем шаге мы рассмотрим заадачу об обедающих мудрецах.