某银行的营业厅有多个柜员窗口,可以同时办理业务。银行的营业厅中安排有n张座椅供储户休息等候。每个储户在进入营业厅时会在排队机上取得一个号码,若此前没有客户,则排队机就会唤醒一个柜员为储户服务,当没有储户时柜员便可以休息。若储户较多,则所有柜员均会参与服务,

admin2013-12-31  46

问题 某银行的营业厅有多个柜员窗口,可以同时办理业务。银行的营业厅中安排有n张座椅供储户休息等候。每个储户在进入营业厅时会在排队机上取得一个号码,若此前没有客户,则排队机就会唤醒一个柜员为储户服务,当没有储户时柜员便可以休息。若储户较多,则所有柜员均会参与服务,当排队储户数超过柜员数时,没有被服务的储户便会在座椅上休息,并等候叫号。当座位满时,再进入营业厅的储户不再从排队机上获取号码,会离开去找另外的营业厅。若将银行的柜员和储户的行为看成是不同类型的进程,请设计一个程序,利用信号量来完成上述操作,用C语言写出程序。

选项

答案设信号量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=waiting-1; //将等候的顾客数减1 V(teller); //提供1个可服务的柜员 V(mutex); //释放排队机 service(); //为储户服务 } } void customer() //储户进程 { P(mutex); //先获得排队机 if(waiting<CHAIRS) //若还有座椅则取号 { waiting=waiting+1; //取号,占用座椅等待叫号 V(customer); //告知系统储户加1 V(mutex); //释放排队机 P(teller); //看是否有柜员空闲 serviced(); //进入窗口被服务 } else //若没有座椅了,则不取号 { V(mutex); //不取号,释放排队机 } } //离开

解析
转载请注明原文地址:https://jikaoti.com/ti/l9ajFFFM
0

最新回复(0)