银行业务问题
某银行有3个业务窗口,15个供等候办理业务的顾客做的座椅。如果没有顾客,银行职员便在业务窗口中等待顾客;当顾客到达时,若没有空椅子,顾客就离开;否则到取号机(仅有一个取号机),然后坐在空椅子上等待叫号;银行职员办理完某个顾客的业务后,如果有等待的顾客,按叫号系统按钮叫号;顾客办完业务后将直接离开。请为银行职员和顾客各编一段程序描述他们的行为。
int chairs = 15; // 座位空位数
int waiting = 0; // 正在等待的顾客数
Semaphore servers = 0; // 职员叫号
Semaphore customers = 0; // 顾客
Semaphore mutex = 1;
process_customer_j {
P(mutex);
if (waiting < chairs) {
// 查看是否还有座位数
取号();
waiting++; // 等待者+1
V(mutex);
V(customers); // 顾客唤醒职员
P(servers); // 等待职员叫号办理该顾客的业务
顾客办理业务();
} else {
V(mutex); // 没座位直接离开银行
}
}
process_servers_i {
while(true) {
P(customers); // 职员等待顾客
P(mutex);
waiting--; // 等待者-1
V(servers); // 叫号
V(mutex);
职员办理业务();
}
}