【问题分析】
传统哲学家进餐问题:5位哲学家,5根筷子,5个碗------只需要考虑使用筷子的互斥问题
本题描述的进餐问题:n位哲学家,n根筷子,m个碗-----还需要考虑使用碗的互斥问题
解决传统的哲学家问题有三种办法:
1.最多允许4位哲学家同时进餐
2.只有当左右筷子同时都拿起时才允许进餐
3.偶数号哲学家先拿左边筷子,奇数号哲学家拿右边筷子
本题描述的哲学家进餐问题在上述方法1的基础上进行扩充。
当n-1<m时,碗足够多,不对互斥问题带来影响,此时最多允许n-1个哲学家进餐
当n-1>m时,碗不够多,会对互斥问题带来影响,此时最多允许m个哲学家进餐
【代码】
semaphore max=min[n-1,m];
semaphore chopsticks[n];
void philosophy(){
for(int i=0;i<n;i++) chopsticks[i]=1;//初始化互斥信号量
while(true){
p(max);
p(chopsticks[i]);
p(chopsticks[(i+1)%n]);
eat();
v(chopsticks[(i+1)%n]);
v( chopsticks[i]);
v(max);
}
}