在用餐哲学家问题的这个修改版本中,哲学家可以使用任何可用的叉子,而不仅仅是左侧和右侧的叉子。给出了使用信号量的原始问题的以下解决方案
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
中的逻辑,该逻辑检查一旦我吃完了,我的邻居现在可以吃...我可以吗?问题的这种变化似乎并不会使它复杂化,但我仍然坚持如何实现这一点。请注意,它仍然必须使用信号量并避免饥饿/死锁。