【正确答案】正确答案:设信号量teller,customer和mutex,设waiting整型量,表示排队的储户数,其初始为0,最大不超过n。 #define CHAIRS=n //座椅数,也是最多排队的储户数 typedef int semaphore //定义信号量 semaphore teller:0; //等待储户的柜员数 semaphore customer=0; //等待服务的储户数 semaphore mutex=0; //对排队机操作的互斥量 int waiting=0; //等待的储户数 void teller( ) { while(TRUE) //并发调度 { P(customer); //查看有无储户 P(mutex); //需要获得排队机的控制权 waiting=wairing=1; //将等候的顾客数减1 v(teller); //提供1个可服务的柜员 v(mutex); //释放排队机 service( ): //为储户服务 } } Void customer() //储户进程 { P(mutex); //先获得排队机 if(waiting
【答案解析】解析:此类题目在考试中也比较多见,但是,万变不离其宗。这类题目类似的还有睡眠的理发师等。因此,掌握此类题目的基本要点是解决此类题目的关键。本题从读者和写者的基本原理出发,对等候的储户数加以限制。从资源角度看,柜员是资源,座椅也是资源。那么,设置柜员的信号量为teller,初始为0,柜员一上岗则作V操作,以提供资源。储户的信号量为customer,初始为0,表示储户尚未进入营业厅。mutex为对排队机,也是座椅的互斥量,柜员和储户均可以对此操作。 [归纳总结]注意到本题中,柜员是具有循环的。即while(TRUE)的语句,储户就没有,原因是储户是随时到达的,柜员是等候储户到来并服务的,如果将储户进程也采用并发调度,则顾客就不可能为0,这与实际情况不同,所以,在此是不需要的。 对柜员来说,当开启一个窗口即会调用一次柜员进程,所以,柜员应该一直运行,直到其下班(下班作为边界条件在此并不讨论),若多个柜员上岗,则就多次调用柜员进程,但是,排队机和座椅是不变的,柜员可能会增加,这会加快对顾客的服务,所以,实际上在营业厅里最多的顾客数应该是柜员数加上座椅数。最少当然是0。