您的位置:首页 > 其它

操作系统 同步互斥问题之 理发师问题

2011-12-30 14:36 351 查看
理发师问题:

理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子

如果没有顾客,理发师便在理发椅上睡觉

一个顾客到来时,它必须叫醒理发师

如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。

解法:

引入3个信号量和一个控制变量:

1)控制变量waiting用来记录等候理发的顾客数,初值均为0;

2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;

3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;

4)信号量mutex用于互斥,初值为1.

var waiting : integer; /*等候理发的顾客数*/

CHAIRS:integer; /*为顾客准备的椅子数*/

customers, barbers,mutex : semaphore;

waiting:=0; CHAIRS:=n;

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 customers<n then

waiting waiting := waiting+1; /* 等候顾客数加1*/

V(customers); /*必要的话唤醒理发师*/

V(mutex); /*开放临界区*/

P(barbers); /*无理发师, 顾客坐着养神*/

get-haircut( ); /*一个顾客坐下等理发*/

else

V(mutex); /*人满了,走吧!*/

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: