任务要求:
男女共浴(或过桥问题)(引自 AST《现代操作系统》 3th, P98)。
1. 假设一个大学为了卖弄其政治上的正确性,准备把美国最高法院的信条“平等但隔
离其本身就是不平等”既运用在种族上也运用在性别上,从而结束校园内长期使用
的浴室按性别隔离的做法。但是,为了迁就传统习惯,学校颁布法令:当有一个女
生在浴室里,那么其他女生可以进入,但是男生不行,反之亦然。在每个浴室的门
上有一个滑动指示符号,表示当前处于以下三种可能状态之一:
空
有女生
有男生
用你偏好的程序设计语言编写下面过程(可以随意采用所希望的计数器和同步技
术):
woman_wants_to_enter
man_wants_to_enter
woman_leaves
man_leaves
思路:类似于读者-写者问题,只不过变成了多写者情况。根据题目提供的信息,很容易得出三个信号量,这三个信号量分别为mutex(性别互斥锁),mutex_man(对男士的操作互斥锁),mutex_woman(对女士的操作互斥锁)。另外,加入计数变量count防止死锁。
void woman_wants_to_enter(void){
down(&mutex);
count = count+1;
wc = wc+1; //女生计数器
if(count == 1 && wc == 1) down(&mutex_man); //女生抢占锁
up(&mutex);
down(&mutex_woman); //这两行对女生是否抢占锁进行检测,up防止只能进入一个女生
up(&mutex_woman);
woman_enter();
}
void woman_leaves(void){
down(&mutex);
wc = wc-1;
if(wc == 0) {
up(&mutex_man);
if(mc != 0) {
count = -1; //防止女生抢占锁
down(&mutex_woman);
}
} //如果最后一个女生洗浴完成,释放男生锁,并且检查是否有男生在等待使用,如果有,阻止女生进入
up(&mutex);
}
void man_wants_to_enter(void){
down(&mutex);
count = count-1;
mc = mc+1;
if(count == -1 && mc == 1) down(&mutex_woman); //若count为-1说明男生比女生多,所以如果存在女生和男生竞争锁且count为-1时mc至少为2
up(&mutex);
down(&mutex_man);
man_enter();
}
void man_leaves(void){
down(&mutex);
mc = mc-1;
if(mc == 0) {
up(&mutex_woman);
if(wc != 0) {
count = 1;
down(&mutex_man);
}
}
up(&mutex);
}