一、问题描述
一群哲学家围绕一个圆桌思考问题,圆桌上摆满了美食。在每个哲学家两边各有一个筷子,两个哲学家之间只有一个筷子,只有当哲学家拿到左右两边的筷子才可以吃饭,当哲学家吃饱了就会将筷子放下来接着进行思考。为了避免哲学家饿死,就诞生出哲学家就餐的问题。
二、思路分析
为了避免哲学家饿死,我们现在给哲学家定另一个规矩:坐在奇数位置的哲学家只能先拿左边的筷子,坐在偶数位的哲学家只能先拿右边筷子。这样在奇数位置的筷子就变成临界变量,谁获取到这个筷子谁就可以吃饭。
三、代码实现
semaphore mutex[]={1,1,1....};
philosopher(){//第i个哲学家
while(1){
if(i%2==0){
P(mutex[i-1]);//偶数位的哲学家拿右边的筷子
P(mutex[i]);
//哲学家就餐
V(mutex[i]);
V(mutex[i-1]);
}
if(i%2==1){
P(mutex[i]);//奇数位的哲学家拿左边的筷子
P(mutex[i-1]);
//哲学家就餐
V(mutex[i]);
V(mutex[i-1]);
}
}
}