Решение:
Инициализация:
{ “Вилки”, которые
используются философами – это разделяемые
ресурсы,
защищенные бинарными
семафорами: }
common
B: array[0..4]
of
binary semaphore;
{ глобальный
массив
семафоров}
for
I:=0
to
4 do
B[I]:=1;
{ все
“вилки”
свободны
}
process
Философ(I:
Integer);
{ Это процесс, описывающий
поведение I-го
философа. }
{
“Вилки”, которыми он ест, защищаются
двумя бинарными семафорами. }
common
B: array[0..4]
of
binary semaphore
begin {
Пытается
получить
вилки:
}
while
(P(B[I])=0)
or
(P(B[(I+1) mod
5])=0) do
;
//P(B[I])
не возвращает значение
{ Ест спагетти, используя
вилки, находящиеся слева и справа } …
{ Освобождает
вилки:
} V(B[(I+1) mod
5]); V(B[I]);
end;
Решение:
Инициализация:
{ “Вилки”, которые
используются философами – это разделяемые
ресурсы,
защищенные бинарными
семафорами: }
common
B: array[0..4]
of
binary semaphore;
{ глобальный
массив
семафоров}
for
I:=0
to
4 do
B[I]:=1;
{ все
“вилки”
свободны
}
process
Философ(I:
Integer);
{ Это процесс, описывающий
поведение I-го
философа. }
{ “Вилки”, которыми
он ест, защищаются двумя бинарными
семафорами. }
common
B: array[0..4]
of
binary semaphore
begin
{ Пытается
получить
вилки:
}
P(B[I]);
P(B[(I+1) mod
5]);
{
Ест спагетти, используя вилки, находящиеся
слева и справа } …
{ Освобождает
вилки:
}
V(B[(I+1) mod
5]); V(B[I]);
end;
//все
философы одновременно взяли по 1 вилке
и все застряли на «P(B[(I+1)
mod
5]);».
Смертельные объятия.