Значения семафора, в то время как клиенты ждут стрижки в сонной парикмахерской проблеме? - PullRequest
0 голосов
/ 01 ноября 2019

Я работаю над использованием значений семафоров в проблеме сонной парикмахера. Я представляю себе сценарий, в котором клиент уже с парикмахером, а затем 4 других клиента входят в парикмахерскую. Зал ожидания рассчитан на три места. Я хочу знать значения семафоров во время этой ситуации, в которой парикмахер уже занят.

Я знаю, что когда клиент впервые входит в магазин, когда парикмахер открывает магазин, я получаю следующие значения семафора:

barber = 0
customer = 0
mutex = 1

Вот мой псевдокод для этой проблемы:

/* Counting semaphores - the integer value represents the initial count for the semaphores */

Semaphore customer = 0; /* Number of customer waiting for service */
Semaphore barber = 0; /* Number of barber waiting for students */
Semaphore mutex = 1; /* Mutual exclusion when accessing the waiting room */

int waiting = 0; /* Students waiting for turn with professor */

Barber() {
  while (TRUE) {
    wait (customer); /* Go to sleep if no customers */
    wait (mutex); /* Get access to waiting room */
    waiting--; /* Decrement number of waiting customers */
    signal (barber); /* Barber is ready */
    signal (mutex); /* Releasing waiting room */
    #GiveHaircut;
  }
}

Customer() {
  wait (mutex); /* Enter critical section, which is the waiting room */
  if (waiting < 3) { /* If there are free chairs in the waiting room */
    waiting++;
    signal (customer); /* Wake up barber if necessary */
    signal (mutex); /* Release access to count of waiting customers */
    wait (barber); /* Wait for barber if not available */
    #GetHaircut;
  } else {
    signal (mutex); /* Waiting area is full, leave without waiting */
  }
}

Когда я пытаюсь отследить этот код и парикмахер уже занят, я продолжаю получать barber = -1.

Я не уверен, возможно ли это в качестве значения, и просто чувствую себя очень растерянным, и я был бы признателен, если бы кто-нибудь мог помочь мне отследить псевдокод, чтобы найти значения семафора в этой ситуации? Я видел только примеры, в которые входит клиент, но никаких других сценариев онлайн. Спасибо.

1 Ответ

0 голосов
/ 01 ноября 2019

Я не уверен, есть ли у вас один или несколько парикмахеров в вашем сценарии, поэтому я дам вам краткие наброски псевдокода для обоих случаев. В обоих случаях мы предполагаем, что у вас есть зал ожидания на 3 места - это означает, что у вас есть семафор с максимальным значением 3, и когда клиенты приходят, они ждут свободного места, и как только их очередь подстригаться, они сигнализируюттеперь есть одно свободное место. Для «мест» мест у нас будет семафор под названием seatAvailable. Единственное «беспокойство» Барбера заключается в том, что у него есть клиенты, поэтому для него мы представим семафор под названием CustomersAvailable.

Итак, когда у вас есть один парикмахер, все ваши клиенты используют один и тот же «ресурс», который является вашимодин парикмахер - так что вам нужен семафор мьютекса, мы назовем его barberMutex.

Один сценарий парикмахера

Semaphore barberMutex = 1
Semaphore customersAvailable = 0
Semaphore seatsAvailable = 3

Barber:
wait(customersAvailable) // wait for customers to show up
# doHaircut...
signal(barberMutex) // after one customer has been served, barber is free

Customer:
wait(seatsAvailable) // wait for an available seat
signal(customersAvailable) // once you've sat signal to you barber that there's customers waiting
wait(barberMutex) // wait if the barber is not free
signal(seatsAvailable) // once it's your turn, you go to barber and there is an open seat
# getHaircut

Сценарий с несколькими парикмахерами Для этого сценария у нас есть несколько парикмахеров, поэтому у нас будет не мьютекс, а семафор с значением n, где n - количество парикмахеров, работающих в этом магазине (скажем, 3 для нашего примера и назовем этот семафор barbersAvailable).

Semaphore barbersAvailable = 3
Semaphore customersAvailable = 0
Semaphore seatsAvailable = 3

Barber:
wait(customersAvailable)
#doHaircut
*signal(barbersAvailable)*

Customer:
wait(seatsAvailable) // wait for an available seat
signal(customersAvailable) // once you've sat signal to you barber that there's customers waiting
*wait(barberAvailable)* // wait for one of the barbers to be free
signal(seatsAvailable) // once it's your turn, you go to barber and there is an open seat
# getHaircut

Я всегда предполагаю, что wait busy ожидает получения ресурса, и после его получения уменьшается значение val для этого семафора, также сигнал увеличивает значение val длясемафор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...