1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
<Chapter Label="Semaphores">
<Heading>Semaphores</Heading>
<Section Label="section:Semaphores">
<Heading>Semaphores</Heading>
Semaphores are synchronized counters; they can also be used to simulate locks.
<ManSection>
<Func Name="CreateSemaphore"
Arg='[value]'/>
<Description>
The function <Ref Func="CreateSemaphore"/> takes an optional argument, which defaults to zero. It is the counter with which the
semaphore is initialized.
<Example><![CDATA[
gap> sem := CreateSemaphore(1);
<semaphore 0x1108e81c0: count = 1>
]]></Example>
</Description>
</ManSection>
<ManSection>
<Func Name="WaitSemaphore"
Arg='sem'/>
<Description>
<Ref Func="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
<Ref Func="SignalSemaphore"/>, then decrements the counter and returns.
<Example><![CDATA[
gap> sem := CreateSemaphore(1);
<semaphore 0x1108e81c0: count = 1>
gap> WaitSemaphore(sem);
gap> sem;
<semaphore 0x1108e81c0: count = 0>
]]></Example>
</Description>
</ManSection>
<ManSection>
<Func Name="SignalSemaphore"
Arg='sem'/>
<Description>
<Ref Func="SignalSemaphore"/> receives a previously created semaphore as its argument. It increments the semaphore's
counter and returns.
<Example><![CDATA[
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>
]]></Example>
</Description>
</ManSection>
<Subsection Label="Simulating locks">
<Heading>Simulating locks</Heading>
In order to use semaphores to simulate locks, create a semaphore with an initial value of 1. <Ref Func="WaitSemaphore"/> is
then equivalent to a lock operation, <Ref Func="SignalSemaphore"/> is equivalent to an unlock operation.
</Subsection>
</Section>
</Chapter>
|