8 Semaphores 8.1 Semaphores Semaphores are synchronized counters; they can also be used to simulate locks. 8.1-1 CreateSemaphore CreateSemaphore( [value] )  function The function CreateSemaphore takes an optional argument, which defaults to zero. It is the counter with which the semaphore is initialized.  Example  gap> sem := CreateSemaphore(1);   8.1-2 WaitSemaphore WaitSemaphore( sem )  function WaitSemaphore receives a previously created semaphore as its argument. If the semaphore's counter is greater than zero, it decrements the counter and returns; if the counter is zero, it waits until another thread increases it via SignalSemaphore (8.1-3), then decrements the counter and returns.  Example  gap> sem := CreateSemaphore(1);  gap> WaitSemaphore(sem); gap> sem;   8.1-3 SignalSemaphore SignalSemaphore( sem )  function SignalSemaphore receives a previously created semaphore as its argument. It increments the semaphore's counter and returns.  Example  gap> sem := CreateSemaphore(1);  gap> WaitSemaphore(sem); gap> sem;  gap> SignalSemaphore(sem); gap> sem;   8.1-4 Simulating locks In order to use semaphores to simulate locks, create a semaphore with an initial value of 1. WaitSemaphore (8.1-2) is then equivalent to a lock operation, SignalSemaphore (8.1-3) is equivalent to an unlock operation.