理发师问题描述如下:
理发店包含一间接待室和一间工作室,有一名理发师,接待室内有n(n≥1)把椅子,而工作室只有1把椅子。如果没有顾客,理发师就去睡觉;如果理发师在睡觉;则顾客会唤醒他;如果理发师在忙且接待室有空闲椅子,那么此顾客会坐在其中1把空闲的椅子上等待;如果来时所有椅子都有人,那么顾客离去。请采用信号量机制解决该理发师问题(用伪代码描述)。
分析:
(1)设置理发师的资源信号量为barber,初值为初始状态可用的资源数,故设barber初值为0(因为没有顾客的时候理发师在睡觉呀)。
(2)设置顾客的资源信号量为customers,初值为0(刚开始没有顾客来)。
(3)用互斥信号量mutex实现进程互斥。
(4)用变量waiting来记录等待的顾客数,判断有没有空闲椅子。
伪代码如下:
semaphore barber,customers,mutex;
barber = customers = 0,mutex = 1;
int waiting = 0;
parbegin
process barber{
while(true){
wait(customers);//barber在等顾客喊他,没有顾客就睡觉
wait(mutex);//只能被一个顾客叫醒
waiting=waiting-1;//有顾客将得到服务,有等待区的椅子空出来
signal(barber);//一个理发师资源被释放
signal(mutex);
cut_hair();//理发师在工作
}
}
process customers{
wait(mutex);//一次只能有一个顾客进行以下操作,即访问椅子
if(waiting<n){//来了个顾客在门口往店里看了看,如果有空闲的椅子
waiting=waiting+1;//进店坐下了
signal(customers);//顾客跟理发师打招呼说“我来了”
signal(mutex);//访问椅子结束
wait(barber);//等待理发师
get_haircut();//得到服务
}else{//看了看发现店里没有位置
signal(mutex);//走了
}
}
parend
更新
最近在考研又看到这题,才发现评论区对于customers这个信号量的设置有很多疑问。首先,空闲椅子的有无影响了等待顾客的数量,而顾客的有无影响了理发师是否开始理发,所以要使用不同的信号量来处理。customers这个信号量的作用,和生产者消费者里面的full的作用差不多。