在哲学家就餐问题的这个修改版本中,哲学家可以使用任何可用的叉子,而不仅仅是他左右的叉子。给出以下使用信号量对原始问题的解决方案
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 个来吃饭。我的第一个想法是我可以删除其中的逻辑,test
并drop_chopsticks
检查是否,一旦我吃完,我的邻居现在可以吃……或者我可以吗?问题的这种变化似乎并不会使它复杂化,但我坚持如何准确地实现这一点。请注意,它仍然必须使用信号量并避免饥饿/死锁。