Я не уверен, есть ли у вас один или несколько парикмахеров в вашем сценарии, поэтому я дам вам краткие наброски псевдокода для обоих случаев. В обоих случаях мы предполагаем, что у вас есть зал ожидания на 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 длясемафор.