前言
hello,大家好,使用pv操作来实现进程的同步和互斥是我们本科授课的重点,同时也是研究生入学考试的重点考察题型。今天给大家带来一道常见的pv操作的考题-理发师理发问题,这里的伪代码仅给大家提供一下思路
问题描述
理发店有一间工作室,有一名理发师,接待室内有n(n≥1)把椅子。如果没有顾客,理发师就去睡觉;如果理发师在睡觉;有顾客需要理发,则顾客会唤醒他;如果理发师在忙且接待室有空闲椅子,那么此顾客会坐在其中1把空闲的椅子上等待;如果来时所有椅子都有人,那么顾客离去。请采用信号量机制解决该理发师问题(用伪代码描述)
解决思路
题目中涉及到两个进程,一个理发师进程,一个顾客进程。在分析一下题目中的同步互斥关系:
理发师和顾客之间是同步关系,若理发师睡觉,顾客需要唤醒他,设置一个同步信号量;
设置一个int值,来代表屋子里的椅子数量
设置一个int值来代表人数。
为了实现对人数的增加和减少,设置一个互斥信号量,来对人数进行互斥访问。
伪代码
//理发师问题
int CHAIR=n,waiting=0 //椅子和人数
semaphore mutex=1 //人数的互斥访问
semaphore customer=0 //顾客信号量
semaphore service=0 //同步
process 顾客:
while(1){
p(mutex)
if(waiting<CHAIR):
waiting++
v(mutex)
v(customer)
P(service) //等待被服务
else:
v(mutex)
//离开
}
process 理发师:
while(1){
p(customer)
p(mutex)
waiting--
v(mutex)
V(service) //服务
//理发
}
总结
这个问题与银行存款问题的解决思路高度一致,实际上就是同步和互斥问题的混合应用。