题目一:两队渡船
一艘船每次可渡4人过河,有红黑两队人过河,要求只允许红、黑各4人或红2人、黑2人一起方可渡河,请使用P、V操作来实现
前期准备:
- 信号量准备:共设有两个信号量,其中mutex表示上船信号量,s表示渡船信号量
- 全局变量准备:红黑队准备渡船人数分别用 x,y表示
- 红队:当红队人数=2且黑队人数>=2或红队人数=4时满足渡船条件,此时暂停上船等待渡船
- 黑队:与红队一样
- 注意:上船方式有三种,对应不同的代码,编写的时候要分类讨论,不能仅用“渡船”一概而论
代码编写:
Semaphore mutex, s; //上船,渡河
mutex.value = 1, s.value = 0;
cobegin
process 红队(){
while(1){
P(mutex);
x++;
if((x == 2 && y >= 2) or x == 4){
//这里不是(x == 2 && y == 2)是因为:
//y>=2时也能满足红黑两队各两人的情况,只要在渡船的时候黑队减去多余的人即可
V(s); //满足渡船需求
goto L1; //goto L1是为了跳过V(mutex)操作,表明上船操作停止
}
V(mutex); //继续上船
L1: ;
}
}
process 黑队(){
while(){
P(mutex);
y++;
if(