理发师问题(Barber Problem)
问题描述 理发店理有一位理发师一把理发椅和n把供等候理发的顾客坐的椅子如果没有顾客理发师便在理发椅上睡觉一个顾客到来时它必须叫醒理发师如果理发师正在理发时又有顾客来到则如果有空椅子可坐就坐下来等待否则就离开
The PV code Using Pascal
)控制变量waiting用来记录等候理发的顾客数初值均为 )信号量customers用来记录等候理发的顾客数并用作阻塞理发师进程初值为 )信号量barbers用来记录正在等候顾客的理发师数并用作阻塞顾客进程初值为 )信号量mutex用于互斥初值为 int waiting=//等候理发的顾客数 int chairs=n//为顾客准备的椅子数 semaphore customers=barbers=mutex=; cobegin barber() begin while(TRUE);//理完一人还有顾客吗? P(cutomers);//若无顾客理发师睡眠 P(mutex);//进程互斥 waiting:=waiting–;//等候顾客数少一个 V(barbers);//理发师去为一个顾客理发 V(mutex);//开放临界区 cuthair();//正在理发 end customer() begin P(mutex);//进程互斥 if(waiting) begin waiting:=waiting+;//等候顾客数加 V(customers);//必要的话唤醒理发师 V(mutex);//开放临界区 P(barbers);//无理发师顾客坐着养神 gethaircut();//一个顾客坐下等理/ end else V(mutex);//人满了走吧! end coend 返回《操作系统之PV金典》 |