Проблема обедающих философов
Primary tabs
Forums:
Проблему можно сформулировать следующим образом:
пять философов сидят за круглым столом, и у каждого есть тарелка со спагетти. Спагетти настолько скользкие, что каждому философу нужно две вилки, чтобы с ними управиться. Между каждыми двумя тарелками лежит одна вилка.Жизнь философа состоит из чередующихся периодов поглощения пищи и размышлений. Когда философ голоден, он пытается получить две вилки, левую и правую, в любом порядке. Если ему удалось получить две вилки, он некоторое время ест, затем кладет вилки обратно и продолжает размышления. Вопрос состоит в следующем: можно ли написать алгоритм, который моделирует эти действия для каждого философа и никогда не застревает?........м?))
Решение, представленное в листинге, исключает взаимоблокировку и позволяет реализовать максимально возможный параллелизм для любого числа философов. Здесь используется массив state для отслеживания душевного состояния каждого философа:
- он либо ест,
- либо размышляет,
- либо голодает (пытаясь получить вилки)
.
Философ может начать есть, только если ни один из его соседей не ест. Соседи философа с номером i определяются макросами LEFT и RIGHT (то есть если i = 2, то LEFT= 1 и RIGHT = 3).
В программе используется массив семафоров, по одному на философа, чтобы блокировать голодных философов, если их вилки заняты.
Обратите внимание, что каждый процесс запускает процедуру philosopher() в качестве своей основной программы, но остальные процедуры take_forks() , put_forks() и test() являются обычными процедурами, а не отдельными процессами.
- Log in to post comments
- 4561 reads