2.哲学家吃面问题
semaphore fork[5];
for(int i=0; i<5;i++)
fork[i]=1;
cobegin
process philosopher_i( ){
while(ture){
think( );
P(fork[i]);
P(fork[(i+10%5]);
eat();
V(fork[i]);
V(fork[(i+10%5]);
}
}
coend
5.一间酒吧里有三个音乐爱好者队列,第一队的音乐爱好者只有随身听,第二队只有音乐磁带,第三队只有电池。而要听音乐就必须随身听、音乐磁带和电池这三种物品俱全。酒吧老板一次出售这三种物品中的任意两种。当一名音乐爱好者得到这三种物品并听完一首乐曲后,酒吧老板才能再一次出售这三种物品中的任意两种。于是第二名音乐爱好者得到这三种物品,并开始听乐曲。全部买卖就这样进行下去。试用P,v操作正确解决这一买卖。
semaphore mutex=1,s1=0,s2=0,s3=0;
cobegin
fan1(){
s1=1;
P(s2);
P(s3);
if(s1&&s2&&s3){
V(mutex);
V(s1);
V(s2);
V(s3);
}
}
fan2(){
s2=1;
P(s1);
P(s3);
if(s1&&s2&&s3){
V(mutex);
V(s1);
V(s2);
V(s3);}
}
fan3(){
s3=1;
P(s1);
P(s2);
if(s1&&s2&&s3){
V(mutex);
V(s1);
V(s2);
V(s3);}
}
}
Coend
6、
semaphore mutex=A, customer_count=0:
Cobegin
Customeri(){
p(mutex);
取号码,进入队列;
v(mutex);
v(customer_count);
}
serversi(){
while(A){
p(customer_count);
p(mutex);
从队列中取下一个号码;
v(mutex);
为该号码持有者服务;
}
}
Coend
7、
Cobegin
Var x:integer; s:semaphore;
s:=A
Process PA
Var y, z:integer;
Begin
p(s);
x:=A;
y:=0;
if x>=A then y:=y+A;
v(s);
z:=y;
End
Process PB
Var t, u:integer;
Begin
p(s);
x:=0;
t:=0;
if x<A then t:=t+B;
v(s);
u:=t;
End
Coend
8、
semaphore S1,S2;
S1=1;S2=0;
cobegin
process P1(){
begin
repeat
P(S1);
拣白子
V(S2);
until false;
end
}
process P2(){
begin
repeat
P(S2);
拣黑子
V(S1);
until false;
end
}
coend.
原文:https://www.cnblogs.com/huchen826089/p/10822161.html