Проблема обедающих философов

Проблему можно сформулировать следующим образом:

пять философов сидят за круглым столом, и у каждого есть тарелка со спагетти. Спагетти настолько скользкие, что каждому философу нужно две вилки, чтобы с ними управиться. Между каждыми двумя тарелками лежит одна вилка.

Жизнь философа состоит из чередующихся периодов поглощения пищи и размышлений. Когда философ голоден, он пытается получить две вилки, левую и правую, в любом порядке. Если ему удалось получить две вилки, он некоторое время ест, затем кладет вилки обратно и продолжает размышления. Вопрос состоит в следующем: можно ли написать алгоритм, который моделирует эти действия для каждого философа и никогда не застревает?........м?))

Решение, представленное в листинге, исключает взаимоблокировку и позволяет реализовать максимально возможный параллелизм для любого числа философов. Здесь используется массив state для отслеживания душевного состояния каждого философа:

  1. он либо ест,
  2. либо размышляет,
  3. либо голодает (пытаясь получить вилки)

.
Философ может начать есть, только если ни один из его соседей не ест. Соседи философа с номером i определяются макросами LEFT и RIGHT (то есть если i = 2, то LEFT= 1 и RIGHT = 3).
проблема обедающих философов на фкн
фкн обедающий 2
В программе используется массив семафоров, по одному на философа, чтобы блокировать голодных философов, если их вилки заняты.
Обратите внимание, что каждый процесс запускает процедуру philosopher() в качестве своей основной про­граммы, но остальные процедуры take_forks() , put_forks() и test() являются обычными процедурами, а не отдельными процессами.