一、问题描述
理发店里有一位理发师、一把理发椅和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);} //没有多的椅子,顾客离开
}
本文介绍了理发师问题,这是一个经典的并发控制问题。在理发店里,理发师根据顾客数量决定是否工作,而顾客则根据店内椅子数量决定是否等待或离开。通过信号量机制,解冑了理发师和顾客的同步问题,确保资源的有效利用和避免死锁。顾客和理发师分别使用互斥信号量和条件变量进行操作,确保了系统的正确运行。
1万+





