问题
问答题
有一个理发师、一把理发椅和n巴供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅子上睡觉;当一个顾客到来时,必须唤醒理发师,进行理发;如果理发师正在理发时,又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开。为理发师和顾客各编一段程序描述他们的行为,要求不能带有竞争条件。
答案
参考答案:使用三个信号量:
·customers,用于记录等候的顾客的数量。
·barbers,用于记录空闲理发师的数量。
·S,用于进程之间的互斥。
另外还需使用一个变量waiting,也是用于记录等候的顾客的数量。
程序如下:
#define CHAIRS 6 /*为等候的顾客准备的椅子数*/
semphore customers=0;
semphore barbers=0;
semaphore S=1; /*用于互斥*/
int waiting=0;
void barber()
{
while(T)
{
P(customers);
P(S);
waiting=waiting-1;
V(barbers);
V(S);理发…
}
}
void customero
{
P(S);
if (waiting<CHAIRS)
{
waiting=waiting+1;
V(customers);
V(S);
P(barbers);
坐下等待:
}
else{
V(S);
}