0

在使用监视器的 Dining Philosophers 实现中,为什么 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);                  
   }
4

1 回答 1

1

它调用了两次,因为每根筷子都被认为是它自己的资源。因此,您需要“signal()”这两个筷子现在都可以单独取用。

我只研究这个问题的理论代码,但我不确定你提到的筷子“i-1”和“i+1”是否正确。我需要查看您的初始化和其余代码,但传统的解决方案通常将哲学家 i 的筷子称为 (i+1) 用于右筷子,将 (i+4) 用于他的左筷子,在 5 个哲学家的情况下.

于 2018-06-10T11:19:27.433 回答