Столовая Философы с использованием мониторов
В реализации "Обедающих философов" с монитором, почему операция putdown() дважды вызывает операцию test()?
procedure take_chopsticks(i)
{
DOWN(me);
pflag[i] := HUNGRY;
test[i];
UP(me);
DOWN(s[i]) }
void test(i)
{
if ( pflag[i] == HUNGRY
&& pflag[i-1] != EAT
&& pflag[i+1] != EAT)
then
{
pflag[i] := EAT;
UP(s[i])
}
}
void drop_chopsticks(int i)
{
DOWN(me);
test(i-1);
test(i+1);
UP(me);
}
1 ответ
Он вызывает его дважды, потому что каждая палочка считается его собственным ресурсом. Поэтому вам нужно 'сигнализировать ()', что обе палочки для еды доступны по отдельности.
Я работаю только над теоретическим кодом для этой проблемы, но я не уверен, что вы ссылаетесь на палочку "i-1" и "i+1" правильно. Мне нужно будет увидеть вашу инициализацию и остальную часть вашего кода, но обычные решения обычно ссылаются на палочки для еды для философа i как (i+1) для правой палочки и (i+4) для его левой палочки, в случае 5 философов,