Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Visual C++] Задача об обедающих философах


Автор: DubrovinAV 7.5.2008, 20:19
Формулировка задачи:

За круглым столом расставлены N стульев, на каждом из которых сидит философ. В центре стола размещено блюдо с макаронами. На столе лежат N вилок, каждая из которых находится между двумя соседними тарелками. Каждый философ может находиться в двух состояниях: размышлять или есть макароны. Для того, чтобы начать есть, философу необходимы две вилки: одна в правой руке, а другая в левой. Закончив еду, философ кладет вилки на место и начинает размышлять до тех пор, пока снова не проголодается.

В этой задаче имеются две опасные ситуации: <заговор соседей> и <голодная смерть>. 
<Заговор соседей> имеет место, когда соседи слева и справа от философа строят козни. Заговорщики поочередно забирают вилки то слева, то справа от <жертвы>. Такие согласованные действия злоумышленников приводят жертву к вынужденному голоданию, так как он никогда не может воспользоваться обеими вилками.
<Голодная смерть> возникает, когда философы одновременно проголодаются и одновременно попытаются взять, например, свою левую вилку. При этом возникает тупиковая ситуация, так как никто из них не может начать есть, не имея второй вилки.

Поведение каждого философа должно моделироваться отдельным процессом или потоком. При использовании процессов, взаимодействие между процессами - философами может осуществляться через дополнительный процесс - обеденный стол, который знает информацию о наличии вилок на столе. В каждом процессе-философе должно быть реализовано несколько алгоритмов взятия вилок, причем номер алгоритма должен указываться при запуске процесса-философа:
1. Философ вначале пытается взять левую вилку, а затем, как только левая вилка оказалась у него, пытается взять правую. При этом он продолжает удерживать левую вилку, если правая недоступна. Если все философы действуют по такому алгоритму, то может возникнуть ситуация <голодная смерть>, т.е. Процессы, моделирующие философов окажутся в тупиковой ситуации (зависнут) 2. Философ выбирает первую вилку случайным образом, в остальном - все тоже самое, что и в первом алгоритме, в т.ч. возможно возникновение тупиковой ситуации, но с меньшей вероятностью, чем в первом случае.


Вопрос
Распишите пожалуйста алгоритм решения данной задачи. Какие средства си++ нужно использовать 

Спасибо

Автор: Rififi 7.5.2008, 20:43
DubrovinAV, 

Распишите пожалуйста алгоритм решения данной задачи
Google -> "Задача об обедающих философах"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)