理发师问题:
一个理发店由一个有几张椅子的等待室和一个放有一张理发椅的理发室组成。
1. 若没有要理发的顾客,则理发师去睡觉;
2. 若一顾客进入理发店,理发师正在为别人理发,且等待室有空椅子,则该顾客就找张椅子按顺序坐下;
3. 若一顾客进入理发店,理发师在睡觉,则叫醒理发师为该顾客理发;
4. 若一顾客进入理发店且所有椅子都被占用了,则该顾客就离开。
这是一个比较复杂的进程同步问题。需要设计两个进程:
*顾客进程Customer()
*理发师进程Barber()
特定义两个信号量customers和barbers实现进程的同步,并定义信号量S实现进程的互斥。
代码如下:
Begin
//定义信号量并初始化
int CHAIRS:=n //为等候的顾客准备的椅子数
信号量: customers=0;
barbers=0;
cut=0;
finish=0;
mutex=1; //用于互斥的信号量
int waiting=0;
Cobegin
//定义并发进程
Process Customer()
{
P(mutex);
If(waiting>CHAIRS)
then
V(mutex) //没有空椅子,离开
Else
{
Aiting=waiting+1;
V(mutex);
V(customers); //唤醒理发师
SIT_ON_chair(); //坐在椅子上等候
P(barbers); //等待理发师召唤
Stand_up(); //从椅子上起身
}
P(mutex);
waiting=waiting-1;
V(mutex);
SIT_ON_cut_chair(); //坐在理发椅上
V(cut); //告诉理发师可以开始理发
P(finish); //等待理发完成
}
void Barber()
{
While(T)
{
P(customers); //等待顾客到来
Clear_cut_chair(); //整理一下理发椅子
V(barbers); //召唤一个顾客
P(cut); //等待顾客就坐
CUT_hair(); //理发
V(finish); //告诉顾客已结束
}
}
Coend
//并发进程的定义结束
End
注意:代码中蓝字的部分可以从顾客进程移到理发师进程中处理