A similar solution was posted here. I wanted to look at this problem because it is a classic example of handling interprocess communication.
In this problem one models a stream of customers coming into a Barber Shop. If the waiting room, or lobby
, is full, then they leave, otherwise they take a seat and wait for a haircut. The barber(s) take customers, cut their hair, and then look for the next customer.
In this code one channel is filled randomly with Customer
s; some of these will wait in the lobby
, others will look for another barber. Within the BarberShop
function, there is a barbers
slice, and a channel named syncBarberChan
. When the function runs, barbers are initialized and added to the slice. When a customer is selected and paired with a barber, the barber is taken out of the slice. At this point the haircut occurs for some period of time. When the haircut is over, the barber is added to the syncBarberChan
. Next the syncBarberChan
is drained for any idle barbers. If a customer is waiting, that newest barber is paired with a customer, otherwise the barber is added back to the slice of barbers.
In this way, the slice holds idle barbers, and the channel is used to signal that a barber is done with a given task.