module Semaphore: SemaphoreA counting semaphore is a counter that can be accessed concurrently by several threads. The typical use is to synchronize producers and consumers of a resource by counting how many units of the resource are available.
The two basic operations on semaphores are:
module Counting:sig..end
Binary semaphores are a variant of counting semaphores where semaphores can only take two values, 0 and 1.
A binary semaphore can be used to control access to a single shared resource, with value 1 meaning "resource is available" and value 0 meaning "resource is unavailable".
The "release" operation of a binary semaphore sets its value to 1, and "acquire" waits until the value is 1 and sets it to 0.
A binary semaphore can be used instead of a mutex (see module
    Mutex) when the mutex discipline (of unlocking the mutex from the
    thread that locked it) is too restrictive.  The "acquire" operation
    corresponds to locking the mutex, and the "release" operation to
    unlocking it, but "release" can be performed in a thread different
    than the one that performed the "acquire".  Likewise, it is safe
    to release a binary semaphore that is already available.
module Binary:sig..end