现有A,B两队人要过河,河上有船,但是每次只能乘坐4个人,并且每次乘客满员才能开船,到河对岸后空船返回。由于某种原因,过河时船上不能同时有三个A队人员、一个B队人员或者一个A队人员、三个B队人员的组合(即其他组合是安全的)。请编写程序,用PV操作正确解决A,B两队人过河的问题,并说明所设置的信号量及其初值。
参考答案:int m=4; //信号量,初始值为4
Embark(A){ //登船函数
P(m);
A.embark();
}
Sail(){ //开船
go();
V(m);V(m);V(m);V(m);
}
while(true){
if(t==0){
int t=4; //记录已经登船人数
int i=0; //记录A登船人数,4时不允许同类再登船
int j=0; //记录B登船人数,4时不允许同类再登船
}
while(team.hasNext()){
ready=team.next();
if(ready==A){
if(i==4)continue; //防止3和1的情况
else{
t--;
j++;
Embark(ready);
}
}
if(i==3||(i==2&&j==1))j=4; //防止3和1的情况
if(J:=3||(j==2&&i==1))i=4; //防止3和1的情况
if(t==0){
Sail();
break;
}
}
team.relnit(); //整理等候队列
}