Now let's implement bounded producer-consumer with semaphores, a Coke machine which is initially empty:
semaphore sem_mutex = 1 // binary semaphore for mutual exclusion, 1==unlocked
semaphore slots_left = Nsemaphore cokes_left = 0producer()down(slots_left)down(sem_mutex)insert Coke into machineup(cokes_left)up(sem_mutex)consumer()down(cokes_left)down(sem_mutex)buy Cokeup(slots_left)up(sem_mutex)
Note that the down(slots left) needs to go before the down(sem mutex), and similarly for down(cokes left) and down(sem mutex), because otherwise the system can end up waiting forever. For example, imagine an empty machine with the consumer arriving ?rst, and calling down(sem mutex) before down(cokes left).
In some sense, the consumer calling down(cokes left) is a reservation to get a Coke in the future. Even if there are no Cokes currently in the machine, the consumer is reserving a claim for a future Cokewith this action. Similarly, the producer calling down(slots left) is a reservation to insert a new Coke in the future.