User manual
44
Een thread mag nooit twee capture – opdrachten uitvoeren zonder tussentijdse release.
De C2 – compiler kan dat niet controleren. Bij veronachtzaming leidt dat tot blokkades in het programma.
Voorbeeld:
byte flag1;
byte flag2;
thread tx
{
capture
flag1; / / blokkade in de 2
e
doorloop
capture
flag2; / / flag1 wordt “vergeten”
/ / . . .
release;
/ / alleen flag2 wordt vrijgegeven
}
De thread tx in het bovenstaande voorbeeld loopt net als elke thread automatisch in een eindeloze lus. Bij
de tweede doorloop van de lus blokkeert hij, omdat flag1 nog op “bezet” staat.
Afsluitend: een voorbeeld van zowel het gebruik van de expliciete als van de impliciete
capture
vorm:
1) Vermijden van aliasing bij toegang tot geheugens door expliciete
capture
float a, b; / / meetwaarden
byte flag; / / synchronisatie – variabele
thread measure
{
capture
flag;
a = get_channel_a ();
b = get_channel_b ();
release;
/ / . . .
}
thread watch
{
capture
flag ;
check (a, b) ;
release ;
/ / . . .
}
2. Synchronisatie van toegang tot resources door impliciete
capture
in een functie
function send ( bytre buf [ ] , int length )
{
capture ;
wait resource.ready () ;
resource.send (buf, length) ;
release ;
}
In het voorbeeld wordt hier een module resource aangenomen, waarvan de functies zelf nog niet
gesynchroniseerd zijn. Alle bibliotheekmodules voor de toegang tot systeemresources van de C-Control II
unit bevatten reeds de benodigde synchronisatie (zie b.v. module hwcom.c2).