一、5位哲学家就餐问题
semaphore fork[5];
for (int i=0;i<5;i++)
fork[i]=1;
cobegin
process philosopher_i( ) { //i= 0,1,2,3,4
while(true) {
think( );
P(fork[i]); //先取右手的叉子
P(fork[(i+1)%5]); //再取左手的叉子
eat( );
V(fork[i]);
V(fork[(i+1)%5]);
}
}
coend
这个解法会出现死锁!
为了避免死锁
1.至多允许四个哲学家同时取叉子
2.奇数号先取左手边的叉子,偶数号先取右手边的叉子
3.每个哲学家取到手边的两把叉子才吃,否则一把叉子也不取
semaphore fork[5];
for (int i=0;i<5;i++)
fork[i]= 1;
semaphore room=4; //增加一个侍者
cobegin
process philosopher_i( ){/*i=0,1,2,3 */
while(true) {
think( );
P(room); //控制最多允许4为哲学家取叉子
P(fork[i];
P(fork[(i+1)%5] ) ;
eat( );
V(fork[i]);
V(fork([i+ 1] % 5);
V(room);
}
}
coend
void philosopher (int i)
{ if i mod 2==0 then
{
P(fork[i]); //偶数哲学家先右手
P(fork[(i+1) mod 5 ]); //后左手
eat();
V(fork[i]);
V (fork[(i+1) mod 5]);
}
else
{
P (fork[(i+1) mod 5 ]); //奇数哲学家,先左手
P (fork[i]); //后右手
eat();
V(fork[(i+1) mod 5]);
V(fork[i]);
}
}
semaphore fork[5];
for (int i=0;i<5;i++)
fork[i]= 1;
cobegin
process philosopher_i( ){/*i=0,1,2,3 */
while(true) {
think( );
P(fork[i];//先取右手的叉子 /*i=4,P(fork[0])*/
P(fork[(i+1)%5] ) ; //再取左手的叉子 /*i=4,P(fork[4])*/
eat( );
V(fork[i]);
V(fork([i+ 1] % 5);
}
}
coend
通过Hoare管程求解哲学家问题
详解:
type dining_philosophers=monitor
int self_count[5];
InterfaceModule IM;
for (int i=0;i<5;i++) //初始化,i为进程号
state[i]=thinking;
define pickup,putdown;
use enter,leave,wait,signal;
void pickup(int i) { //i=0,1,...,4
enter(IM);
state[i]=hungry;
test(i);
if(state[i]!=eating)
wait(self[i],self_count[i],IM);
leave(IM);
}
void putdown(int i) { //i=0,1,2,..,4
enter(IM);
state[i]=thinking;
t