问题描述
一栋学生公寓里,只有一间浴室,且每次仅能容纳一人。公寓里有男生也有女生。因此制定如下规定:(1)每次只能有一个人在使用浴室;(2)女生的优先级要高于男生;(3)对于同性别的人来说,采用先来先服务的原则。下面给出4个函数,要求用信号量和PV原语实现这4个函数,来模拟上述规定下浴室里的过程。(假设初始时浴室为空)
(1)男生想要使用浴室: boy_wants_to_use_bathroom;
(2)男生离开浴室: boy_leaves_bathroom;
(3)女生想要使用浴室: girl_wants_to_use_bathroom;
(4)男生离开浴室: girl_leaves_bathroom;
按照个人理解,boy_wants_to_use_bathroom和girl_wants_to_use_bathroom是随机出现的,boy_leaves_bathroom和girl_leaves_bathroom是循环执行的。
概念
P原语:申请一个空闲的资源,把信号量-1,如果成功,退出原语,否则进程被阻塞;V原语:释放一个被占用的资源,信号量+1,如果有被阻塞的进程,将其唤醒。
解答
(1)信号量定义int boy_waiting = 0, girl_waiting = 0, using = 0; // 等待队列中的男生/女生数; 浴室每人使用
Semaphore S_mutex = 1, S_boys = 0, S_girls = 0; // 空闲的资