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


就是采取在释放leave_barberchair 信号之前,完成付款操作 。这样该理发师无法进入
下一轮循环为另外顾客服务 , 只能到收银台收款 。
(2)本算法是通过给理发师编号的方式 , 当顾客坐到某理发椅上也同时获得理发师的编号,
如此 , 当该理发师理发结束,释放信号,顾客只有接收到为其理发的理发师的理发结束信号
才会进行付款等操作 。这样实现,是为避免这样的错误,即:如果仅用一个finished 信
号量的话,很容易出现别的理发师理发完毕释放了finished 信号,把正在理发的这位顾
客赶去付款,而已经理完发的顾客却被阻塞在理发椅上的情形 。当然也可以为顾客进行编
号,让理发师获取他理发的顾客的编号,但这样就会限制顾客的数量 , 因为finished[]
数组不能是无限的 。而为理发师编号,则只需要三个元素即可 。
3.参考文献:
左金平 计算机操作系统中哲学家进餐问题探究 。
参考教材 操作系统—内核与设计原理
其他网络资源
barber system是什么意思barber system
理发师系统
设计思想的说明:
打瞌睡的理发师问题是一种同步问题的抽象描述 。计算机系统中的每个进程都可以消费或生产某类资源理发师问题java代码,当系统中某一进程使用某一资源时理发师问题java代码,可以看作是消耗,且该进程称为消费者 。而当某个进程释放资源时 , 则它就相当一个生产者 。因此此题可看作是n个生产者和1个消费者问题 。顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品) 。并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得),所以可以通过一个有界缓冲区把理发师和顾客联系起来通过对信号进行P、V操作来实现有关问题和相关描述 。
求五个操作操作系统的经典同步互斥问题理发师问题:
理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子
如果没有顾客,理发师便在理发椅上睡觉
一个顾客到来时,它必须叫醒理发师
如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开 。
解法:
引入3个信号量和一个控制变量:
1)控制变量waiting用来记录等候理发的顾客数,初值均为0;
2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;
3)信号量barbers用来记录正在等候顾客的理发师数 , 并用作阻塞顾客进程,初值为0;
4)信号量mutex用于互斥,初值为1.
var waiting : integer;/*等候理发的顾客数*/
CHAIRS:integer;/*为顾客准备的椅子数*/
customers, barbers,mutex : semaphore;
customers := 0; barbers := 0; waiting := 0; mutex := 1;
Procedure barber;
begin
while(TRUE);/*理完一人,还有顾客吗?*/
P(cutomers);/*若无顾客,理发师睡眠*/
P(mutex);/*进程互斥*/
waiting := waiting – 1;/*等候顾客数少一个*/
V(barbers);/*理发师去为一个顾客理发*/
V(mutex);/*开放临界区*/
cut-hair( );/*正在理发*/
end;
procedure customer
begin
P(mutex);/*进程互斥*/
if waitingwaiting := waiting+1;/* 等候顾客数加1*/
V(customers);/*必要的话唤醒理发师*/
V(mutex);/*开放临界区*/
P(barbers);/*无理发师, 顾客坐着养神*/
get-haircut( );/*一个顾客坐下等理发*/

推荐阅读