Semaphores are synchronized counters; they can also be used to simulate locks.
‣ CreateSemaphore ( [value] ) | ( function ) |
The function CreateSemaphore
takes an optional argument, which defaults to zero. It is the counter with which the semaphore is initialized.
gap> sem := CreateSemaphore(1); <semaphore 0x1108e81c0: count = 1>
‣ 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.
gap> sem := CreateSemaphore(1); <semaphore 0x1108e81c0: count = 1> gap> WaitSemaphore(sem); gap> sem; <semaphore 0x1108e81c0: count = 0>
‣ SignalSemaphore ( sem ) | ( function ) |
SignalSemaphore
receives a previously created semaphore as its argument. It increments the semaphore's counter and returns.
gap> sem := CreateSemaphore(1); <semaphore 0x1108e81c0: count = 1> gap> WaitSemaphore(sem); gap> sem; <semaphore 0x1108e81c0: count = 0> gap> SignalSemaphore(sem); gap> sem; <semaphore 0x1108e81c0: count = 1>
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.
generated by GAPDoc2HTML