理发师问题

来源:互联网 发布:php好不好就业 编辑:程序博客网 时间:2024/05/01 03:02

问题描述:

  理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子如果没有顾客,理发师便在理发椅上睡觉一个顾客到来时,它必须叫醒理发师如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。

  

  The P,V code Using Pascal

  

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

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

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

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

  int waiting=0//等候理发的顾客数

  int chairs=n//为顾客准备的椅子数

  semaphore customers=0,barbers=0,mutex=1;

  cobegin

    barber()

    begin

      while(TRUE);//理完一人,还有顾客吗?

      P(cutomers);//若无顾客,理发师睡眠

     P(mutex);//进程互斥

     waiting:=waiting–1;//等候顾客数少一个

     V(barbers);//理发师去为一个顾客理发

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

     cut-hair();//正在理发

    end

    customer()

    begin

     P(mutex);//进程互斥

     if(waiting)

     begin

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

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

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

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

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

     end

    else

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

    end

  coend

 

 

原创粉丝点击