A counting semaphore is a synchronization object that allows different threads to coordinate their use of a shared resource that contains some number of available units. The meaning of each unit depends on what the semaphore is being used to synchronize.
The three main functions associated with semaphores are:
make-semaphore, which makes a new semaphore object;
semaphore-acquire, which acquires units from a semaphore and
semaphore-release, which releases units back to a semaphore. The current thread will block if it attempts to acquire more units than are current available.
The functions
semaphore-name,
semaphore-count and
semaphore-wait-count can be used to query the name, available unit count and count of waiting units from a semaphore.