一、问题描述
理发店里有一位理发师、一把理发椅和n 把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉;当一个顾客到来时,它必须叫醒理发师;如果理发师正在理发时又有顾客来到,那么,如果有空椅子可坐,顾客就坐下来等待,否则就离开理发店。
二、解决方法
(解法一):
可以从题中发现,我们在需要的信号量有:
顾客数量(开局没有顾客)customers=0;
理发师(开局睡觉) barbers=0;
等待人数 waiting=0;
互斥信号(人数不能同时增加减少)mutex=1;
椅子的数量 CHAIRS;
理发师:
void barbers(void){
while(TRUE){ //理发师需要查看是否还有有顾客;
P(customers); //若没有顾客,理发师就将阻塞在这里;若有顾客,则继续执行
P(mutex); //实现信号量互斥
waiting=wait-1; //等待人数减一
V(barbers); //理发师出现
V(mutex); //停止互斥
cutHair(); //开始理发
}
}
顾客:
void customer(void){
P(mutex); //顾客出现,先实现互斥
if(waiting<CHAIRS){ //如果等待的人数比店里的椅子少,则实现下面的操作
waiting=waiting+1; //等待的人数+1
V(mutex); //结束互斥
P(barbers); //看是否还有理发师,没有则阻塞在这里,有则继续
getHairCut();} //执行理发
else {V(mutex);} //没有多的椅子,顾客离开
}