voorbeeld. Dan kan de measure – thread al nieuwe waarden geregistreerd hebben, voor de watch –
thread weer aan de beurt komt. De watch – thread gaat door met zijn uitvoering met het laden van a en b
en het oproepen van check. Aan de functie check wordt nu dus een a uit een oude en b uit de nieuwe
meetcyclus doorgegeven. Afhankelijk van wat check concreet van a en b verwacht, dan dit tot een
ernstige fout in het functioneren van het programma leiden! In het ongunstigste geval loopt een
programma met een potentieel aliasing – probleem in de testfase volledig zonder problemen, als de
aliasing – voorwaarde meer zeer zelden optreedt.
Om aliasing- en concurrentiesituaties te vermijden, moeten threads op bepaalde plaatsen
gesynchroniseerd worden, d.w.z. alle threads moeten gedwongen worden voor de verdere bewerking van
het programma te wachten op een soort "vrij" teken. Bij beschikbaarheid van het "vrij" teken moet de
wachtende thread onmiddellijk een "bezet" signaleren, om concurrerende threads tot wachten te dwingen.
Als een thread het kritische programmabereik doorlopen heeft, moet hij het "bezet" terugnemen en het
"vrij" teken signaleren. Anders zouden de op het "vrij" teken wachtende threads voor altijd geblokkeerd
zijn.
Als de problematiek precies bekeken wordt, dan wordt het duidelijk dat de actie "testen op "vrij" teken, zo
ja, bezetten" atomair moet zijn, d.w.z. niet door een thread – wissel mag worden onderbroken. Een wait –
opdracht met daarop volgend wissen van een "vrij" – variabele voldoet niet aan deze voorwaarde!
Voorbeeld:
wait free;
free = 0;
bestaat uit 4 virtuele machine – operaties. Aangenomen dat een thread hier het "vrij" teken krijgt, dan
vindt hier een thread -wissel plaats, voordat hij free op 0 kan zetten. Een tweede thread, die eveneens op
dit vrijteken wacht, krijgt nu rekentijd. Het signaal staat nog op "vrij", hoewel een andere thread al het
kritische bereik betreden heeft!
Om het synchronisatieprobleem op te lossen, stelt de virtuele machine de C-Control II unit een atomaire
machine – operatie ter beschikking, waar in de C2 via het codewoord capture toegang mee gekregen
kan worden.
De capture – opdracht bestaat in een expliciete en een impliciete vorm. De expliciete vorm verwacht de
aanduiding van een kenmerk van een globale (!) byte – variabele.
Voorbeeld:
byte flag;
thread tx
{
capture flag;
/ / . . .
}
Bij het uitvoeren van de capture – opdracht test de actuele thread, of de waarde van de variabele 0 is (=
"vrij" teken). Indien dat het geval is, schrijft de thread zijn eigen nummer (waarde 1 ... 255) in de variabele
en onthoudt het adres van de byte – variabele. Zoals al eerder genoemd, deze procedure verloopt
atomair, in
n enkele operatie van de virtuele machine.
De impliciete vorm luidt:
capture;
zonder verdere aanduidingen. De impliciete vorm kan alleen gebruikt worden binnen de opdrachtblokken
van functies, niet in die van threads. De impliciete vorm gebruikt globale byte – variabelen, die door de
C2-compliter automatisch aangelegd worden. Bij elke functie bestaat een dergelijke variabele.
Het zetten van het "vrij" signaal vindt plaats door het codewoord release. Omdat een thread onthoudt
welke byte - variabele hij bezet heeft, staat de release opdracht zonder verdere aanduidingen.
release;
Een thread moet release onmiddellijk oproepen, als hij het gesynchroniseerde bereik verlaat. Andere,
voor capture wachtende threads worden anders onnodig geblokkeerd.
/ / 2 virtuele machine – operaties
/ / 2 virtuele machine – operaties
/ / explicit: capture the flag
43