به نام خدا

Fatal Error
Welcome To Fatal Error Weblog

  سلمانی خوابیده

یک مغازه سلمانی دارای اتاق انتظاری با n صندلی و اتاق کوپ دارای یک صندلی کوپ می باشد . اگر هیچ مشتری وجود نداشته باشد سلمانی به خواب می رود . اگر مشتری وارد مغازه شود و همه صندلی ها اشغال باشد مغازه را ترک می کند. اگر سلمانی مشغول باشد ولی صندلی خالی باشد آنگاه مشتری روی یکی از صندلی ها می نشیند. اگر سلمانی خواب باشد مشتری او را بیدار می کند .

رهیافت این مسئله به صورت زیر است. ممکن است شما ایم مسئله را از راه بهتری حل کنید :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

semaphore BarberChair , WaitingRoom , Barber;

const int hair_cut = 1000;

const int waiting_chair = 5;

int numWaiting = 0;

enum {idle , busy}BarberState;

enum {empty , full}ChairState;

//Customer Action

while(TRUE)

{

      int n;

      wait(WaitingRoom);

            if(numWaiting == waiting_chair)

            {

                  signal(WaitingRoom);

                  signal(Barber);

                  exit(1);

            }

            else if(numWaiting < waiting_chair && numWaiting > 0)

            {

                        n = numWaiting;

                        numWaiting = (numWaiting + 1) % whaiting_chair;

                  signal(WaitingRoom);

                  signal(Barber);

                  delay(n * hair_cut);

            }

            else if(numWaiting == 0)

            {

                  wait(Barber);

                  if(BarberState == idle)

                  {//wake up barber

                        signal(WaitingRoom);

                        wait(Barber);

                        wait(BarberChair);

                              BarberState = busy;

                              chairState = full;

                        signal(BarberChair);

                        signal(Barber);

                              delay(hair_cut);

                        wait(BarberChair);

                        wait(Barber);

                              chairState = empty;

                              BarberState = idle;

                        signal(BarberChair);

                        signal(Barber);

                  }

                  else

                  {//barber is working

                              numWaiting = (numWaiting + 1) % whaiting_chair;

                        signal(WaitingRoom);

                        signal(Barber);

                        delay(hair_cut);

                  }

            }

}

//Barber Action

while(TRUE)

{

      wait(Barber);

            if(BarberState == idle)

            {

                  wait(WaitingRoom);

                  if(numWaiting > 0)

                  {

                        wait(BarberChair);

                              numWaiting = (numWaiting - 1) % whaiting_chair;

                              BarberState = busy;

                              chairState = full;

                        signal(WaitingRoom);

                        signal(BarberChair);

                        signal(Barber);

                              delay(hair_cut);

                        wait(BarberChair);

                        wait(Barber);

                              chairState = empty;

                              BarberState = idle;

                        signal(BarberChair);

                        signal(Barber);

                  }

                  else

                  {//SLEEP

                        signal(WaitingRoom);

                        signal(Barber);  

                  }

            }

            else

            //barber is busy do no thing

                  signal(Barber);

}

 

تگ های این مطلب :مسئله سلمانی خوابیده
و تگ های این مطلب :sleeping barber
نویسنده : Fatal Error | ساعت ۳:٠٩ ‎ب.ظ روز ۱۳۸٧/۱٠/۱٢
پيام هاي ديگران () | لینک ثابت