用信号量修改的餐饮哲学家

时间:2017-03-08 17:27:38

标签: semaphore dining-philosopher

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

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中的逻辑,该逻辑检查一旦我吃完了,我的邻居现在可以吃...我可以吗?问题的这种变化似乎并不会使它复杂化,但我仍然坚持如何实现这一点。请注意,它仍然必须使用信号量并避免饥饿/死锁。

0 个答案:

没有答案