2

在哲学家就餐问题的这个修改版本中,哲学家可以使用任何可用的叉子,而不仅仅是他左右的叉子。给出以下使用信号量对原始问题的解决方案

system DINING_PHILOSOPHERS

VAR me:    semaphore, initially 1;                    /* for mutual exclusion */ 

s[5]:  semaphore s[5], initially 0;               /* for synchronization */ 

pflag[5]: {THINK, HUNGRY, EAT}, initially THINK;  /* philosopher flag
*/


procedure philosopher(i)   {
    while TRUE do
     {
       THINKING;
       take_chopsticks(i);
       EATING;
       drop_chopsticks(i);
     }   }

procedure take_chopsticks(i)   {
    DOWN(me);               /* critical section */
    pflag[i] := HUNGRY;
    test[i];
    UP(me);                 /* end critical section */
    DOWN(s[i])              /* Eat if enabled */    }

void test(i)            /* Let phil[i] eat, if waiting */   {
    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);                /* critical section */
    test(i-1);               /* Let phil. on left eat if possible */
    test(i+1);               /* Let phil. on rght eat if possible */
    UP(me);                  /* up critical section */    }

所以我希望对上面的伪代码进行简单的编辑,让哲学家可以使用5 个叉子中的任意2 个来吃饭。我的第一个想法是我可以删除其中的逻辑,testdrop_chopsticks检查是否,一旦我吃完,我的邻居现在可以吃……或者我可以吗?问题的这种变化似乎并不会使它复杂化,但我坚持如何准确地实现这一点。请注意,它仍然必须使用信号量并避免饥饿/死锁。

4

0 回答 0