一、仅允许四个哲学家同时就餐
semaphore chopstick[5]={1,1,1,1,1};
semaphore room=4;
void philosopher(int i)
{
while(true)
{
think();
wait(room);
wait(chopstick[i]);
wait(chopstick[(i+1)%5]);
eat();
signal(chopstick[(i+1)%5]);
signal(chopstick[i]);
signal(room);
}
}
二、同时拿起左边和右边筷子
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
while(true)
{
swait(chopstick[i],chopstick[(i+1)%5]);
think();
eat();
ssignal(chopstick[i],chopstick[(i+1)%5]);
}
}
三、让取筷子的操作形成一个原子操作
semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex;
void philosopher(int i)
{
while(true)
{
think();
wait(mutex);
wait(chopstick[i]);
wait(chopstick[(i+1)%5]);
signal(mutex);
eat();
signal(chopstick[(i+1)%5]);
signal(chopstick[i]);
signal(room);
}
}
奇数号哲学家先竞争左边的筷子,偶数号哲学家先竞争右边的筷子
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
while(true)
{
think();
if(i%2==0)
{
wait(chopstick[(i+1)%5]);
wait(chopstick[i]);
eat();
signal(chopstick[i]);
signal(chopstick[(i+1)%5]);
}
else
{
wait(chopstick[i]);
wait(chopstick[(i+1)%5]);
eat();
signal(chopstick[(i+1)%5]);
signal(chopstick[i]);
}
}
}
主函数
void main()
{
philosopher(0);
philosopher(1);
philosopher(2);
philosopher(3);
philosopher(4);
}