Задача об обедающих философах Дейкстры
Вот немогу решить эту задачю:
За круглым столом расставлены N стульев, на каждом из которых сидит философ. В центре стола размещено блюдо с макаронами. На столе лежат N вилок, каждая из которых находится между двумя соседними тарелками. Каждый философ может находиться в двух состояниях: размышлять или есть макароны. Для того, чтобы начать есть, философу необходимы две вилки: одна в правой руке, а другая в левой. Закончив еду, философ кладет вилки на место и начинает размышлять до тех пор, пока снова не проголодается. В этой задаче имеются две опасные ситуации: <заговор соседей> и <голодная смерть>. <Заговор соседей> имеет место, когда соседи слева и справа от философа строят козни. Заговорщики поочередно забирают вилки то слева, то справа от <жертвы>. Такие согласованные действия злоумышленников приводят жертву к вынужденному голоданию, так как он никогда не может воспользоваться обеими вилками. <Голодная смерть> возникает, когда философы одновременно проголодаются и одновременно попытаются взять, например, свою левую вилку. При этом возникает тупиковая ситуация, так как никто из них не может начать есть, не имея второй вилки. Поведение каждого философа должно моделироваться отдельным процессом или потоком. При использовании процессов, взаимодействие между процессами - философами может осуществляться через дополнительный процесс - обеденный стол, который знает информацию о наличии вилок на столе. В каждом процессе-философе должно быть реализовано несколько алгоритмов взятия вилок, причем номер алгоритма должен указываться при запуске процесса-философа: 1. Философ вначале пытается взять левую вилку, а затем, как только левая вилка оказалась у него, пытается взять правую. При этом он продолжает удерживать левую вилку, если правая недоступна. Если все философы действуют по такому алгоритму, то может возникнуть ситуация <голодная смерть>, т.е. Процессы, моделирующие философов окажутся в тупиковой ситуации (зависнут) 2. Философ выбирает первую вилку случайным образом, в остальном - все тоже самое, что и в первом алгоритме, в т.ч. возможно возникновение тупиковой ситуации, но с меньшей вероятностью, чем в первом случае. 3. Вы должны предложить и реализовать такой алгоритм поведения философов, который гарантированно не приведет к ситуациям <заговор соседей> и <голодная смерть>. Помогите плиз, написал вроде все правильно но не работает в чем загвоздка??? Код:
#include <windows.h> |
что не работает то?
-- внутри одного процесса мутекс и critical section даёт один эффект. А в данном случае я бы рекомендовал InterlockedCompareExchange |
Цитата:
Не работает то что каждый философ сразу берет вилку , у вех философов по одной вилке в руке и они ожидают када освободится вторая, и все висит. |
можно внести элемент случайности (не обязательно по команде брать левую вилку) можно подумать случайное число секунд, попробовать взять случайной рукой вилку. Если вилка занята, подождать случайное число секунд, взять случайную вилку.
InterlockedExchange выполняет атомарную операцию, т.е. за 1 цикл процессора, не позволяя двум потокам выполнить её одновременно. InterlockedExchange меняет местами 2 dword-а, InterlockedCompareExchange сравнивает 2 значения и меняет их местами с 3-м, если сравнение дало true. На интеловских процессорах выполняется одной инструкцией. |
Время: 11:58. |
Время: 11:58.
© OSzone.net 2001-