Столовая Философы с использованием мониторов

В реализации "Обедающих философов" с монитором, почему операция 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 философов,

Другие вопросы по тегам