理发店有一位理发师 一把理发椅及三把供等候理发的顾客坐的椅子。如果没有顾客 理发师就去睡觉。如

大学 理发师,顾客,椅子 已帮助 人

理发店有一位理发师、一把理发椅及三把供等候理发的顾客坐的椅子。如果没有顾客,理发师就去睡觉。如果顾客来时所有的椅子都有人,那么顾客就离去。如果理发师在忙而有空闲的椅子,那么顾客就会坐在其中的一个空闲的椅子上。如果理发师在睡觉,顾客会唤醒他。请利用信号量(semaphores),写个程序来协调理发师和顾客进程。

请帮忙给出正确答案和分析,谢谢!

热搜:人体解剖是猴体解剖的一把钥匙

答案解析

难度★★☆ 搜索
  • 正确答案:int count=0: //记录理发店里的顾客数 semaphore baber_chair=1; //理发椅一张 semaphore wait_chair=3; //顾客等待时坐的椅子三张 semaphore mutex=1: //用于互斥地访问count变量所用的信号量 semaphore ready=0: //把准备好可以理发的顾客数量当成理发师所需要的资源 semaphore finish=0: //把理发师完成理发后发给顾客的信号作为理发中的顾客等待的资源 Barber(){ //理发师进程 while(1){ wait(ready); //等待理发椅上的顾客准备好 barbering signal(finish); //告诉理发椅上的顾客理发完成 } } Customer(){ //顾客进程 while(1){ wait(mutex); if(count>=4){ //如果理发店里已经有4个顾客了 signal(mutex); leave } else{ //理发店里顾客不足4个 count++: //更新顾客人数 signal(mutex); } wait(wait_chair); //先请求坐等待时坐的椅子 wait(baber_chair); //再请求坐理发椅 signal(wait_chair); //坐上理发椅后让出等待时坐的椅子 signal(ready); //告诉理发师I’m ready be barbered wait(finish); //等待理发师完成理发 signal(baber_chair); //离开理发椅 wait(mutex); count——: //更新店里的顾客人数 signal(mutex); } }
    当顾客来的时候所有的椅子上都有人的话顾客就离去,而不是等待,所以需要有个变量来记录当前理发店里顾客的数量,以做判断之用。理发椅和等待的顾客坐的椅子都可以当作临界资源处理。