问题描述:
一家银行里有5个窗口,有20个座位(最多容纳20人进入),一台取号机(一次仅供一个人使用)。
分析:
客户:
- 判断银行里是否有空位置,否则被保安拦在外面等待,即阻塞。
- 进入银行后,执行取号操作,若有人占用,则排队等候,即阻塞。
- 取完号之后坐在椅子上等候,判断有无空闲窗口,即再次阻塞。
- 有人离开,客户便可以根据号码,去指定空闲窗口办理业务。
职员:
- 判断银行里面有无客户,即cusnum是否为0,阻塞。
代码:
// 初始化同步型信号量,cusnum:当前顾客数,seat:当前座位数,clerk:当前窗口数,mutex:取号机
var:
semaphore int cusnum = 0, seat = 20, clerk = 5, mutex = 1;
void Customer():
while(true):
wait(seat); // 判断银行是否可以进入,seat < 0 则 block
wait(mutex); // 判断取号机是否占用
...
get ticket
...
signal(mutex); // 归还取票机资源
signal(cusnum); // cusnum++;
...
sit down
...
wait(clerk); // 判断是否有空闲窗口
...
stand up
processing
...
signal(seat); // 离开后seat++
...
go out
...
void Assistant():
while(true):
wait(cusnum); // 判断是否有客户
...
call customer and work
...
signal(clerk); // clerk++
一起学习,共同进步!