理发师问题java代码 理发师在线问答( 三 )


{
think();
get_forks(process);
eat();
put_forks(process);
}
}
2.理发师问题:一个理发店有一个入口和一个出口 。理发店内有一个可站5 位顾客的站席
区、4 个单人沙发、3 个理发师及其专用理发工具、一个收银台 。新来的顾客坐在沙发上等
待;没有空沙发时,可在站席区等待;站席区满时,只能在入口外等待 。理发师可从事理
发、收银和休息三种活动 。理发店的活动满足下列条件:
1)休息的理发师是坐地自己专用的理发椅上,不会占用顾客的沙发;
2)处理休息状态的理发师可为在沙发上等待时间最长的顾客理发;
3)理发时间长短由理发师决定;
4)在站席区等待时间最长的顾客可坐到空闲的理发上;
5)任何时刻最多只能有一个理发师在收银 。
试用信号量机制或管程机制实现理发师进程和顾客进程 。
原理:
(1)customer 进程:
首先检查站席区是否已满(stand_capacity),若满选择离开,否则进入站席区,即进入
理发店 。在站席区等待沙发的空位(信号量sofa),如果沙发已满,则进入阻塞等待队列 , 
直到出现空位,在站席区中等待时间最长的顾客离开站席区(stand_capacity) 。坐到沙
发上,等待理发椅(barber_chair) , 如果理发椅已满,则进入阻塞等待队列,直到出现
空位,在沙发上等待时间最长的顾客离开沙发(释放信号量sofa) 。坐到理发椅上,释放
准备好的信号(customer_ready),获得该理发师的编号(0~1 的数字) 。等待理发师理
发结束(finished[barber_number]) 。在离开理发椅之前付款(payment),等待收据
(receipt) , 离开理发椅(leave_barberchair) 。最后离开理发店 。
这里需要注意几点:
a) 首先是几个需要进行互斥处理的地方 , 主要包括:进入站席区、进入沙发、进入理发椅
和付款几个地方 。
b) 通过barber_chair 保证一个理发椅上最多只有一名顾客 。但这也不够 , 因为单凭
baber_chair 无法保证一名顾客离开理发椅之前,另一位顾客不会坐到该理发椅上,
因此增加信号量leave_barberchair,让顾客离开理发椅后 , 释放该信号,而理发
师接收到该信号后才释放barber_chair 等待下一位顾客 。
c) 在理发的过程中,需要保证是自己理发完毕 , 才能够进行下面的付款、离开理发椅的活
动 。这个机制是通过customer 进程获得给他理发的理发师编号来实现的,这样,当
该编号的理发师释放对应的finished[i]信号的时候,该顾客才理发完毕 。
d) 理发师是通过mutex 信号量保证他们每个人同时只进行一项操作(理发或者收款) 。
e) 为了保证该顾客理发完毕后马上可以付款离开,就应该保证给该顾客理发的理发师在理
发完毕后马上到收银台进入收款操作而不是给下一位顾客服务 。在伪码中由以下机制实
现:即顾客在释放离开理发椅的信号前,发出付款的信号 。这样该理发师得不到顾客的
离开理发椅的信号,不能进入下一个循环为下一名顾客服务 , 而只能进入收款台的收款
操作 。直到顾客接到收据后,才释放离开理发椅的信号,离开理发椅,让理发师释放该
理发椅的信号,让下一位等待的顾客坐到理发椅上 。
(2)barber 进程
首先将该理发师的编号压入队列,供顾客提取 。等待顾客坐到理发椅坐好(信号量
customer_ready),开始理发,理发结束后释放结束信号(finished[i]) 。等待顾客

推荐阅读