问题 问答题

理发店有一位理发师、一把理发椅及三把供等候理发的顾客做的椅子。如果没有顾客,理发师就去睡觉。如果顾客来时所有的椅子都有人,那么顾客就离去。如果理发师在忙而有空闲的椅子,那么顾客就会坐在其中的一个空闲的椅子上。如果理发师在睡觉,顾客会唤醒他。请利用信号量(semaph。res),写个程序来协调理发师和顾客进程。

答案

参考答案:本题中使用两个信号量,customers用来记录等候理发的顾客数,其初值为0;互斥信号量mutex初值为1,用于实现共享变量的互斥访问;共享变量R记录等候的顾客数初值为0,因为只有三把等候椅,则最大值为3。
Semaphore customers=0:
Semaphore mutex=1;
Semaphore R=0:
Main()
Cobegin{
理发师:
Begin
Repeat
P(customers);∥有顾客等待
P(mutex);
R=R-1;∥等待顾客数减一
V(mutex);
理发;
Until false;
顾客:
Begin
Repeat
P(mutex);∥检查是否有空椅子可是坐
If(R<3)then
Begin
R=R+1:
V(customers);∥有则坐下,等候顾客数加1
V(mutex);
等待理发;
End
Else V(mutex);∥无空位离开
Until false;
}

问答题 简答题
单项选择题