ProvaTeorica 2014.01.22
Jump to navigation
Jump to search
URL: http://www.cs.unibo.it/~renzo/so/compiti/2014.01.22.tot.pdf
@author: Alessandro
monitor bridge {
condition oktomove; /*si muove solo se il ponte è libero o non ci sono auto che vengono nel senso opposto */
int turn=0; /*indica il senso delle auto */
int est=0,ovest=0; /*contatori delle auto da est e da ovest */
Queue q; /*coda delle senso delle macchine in attesa */
procedure entry enter (char EoW)
{
if(EoW == "E") /* viene da est */
{
if(turn == 2 || est >=N || !empty(q))
{
q=equeue("E"); /*inserisco nella coda dei sensi*/
oktomove.wait(); /*aspetta*/
}
turn = 1; /*impongo il senso delle auto in circolo nel ponte */
est++;
}
else /* viene da ovest */
{
if(turn ==1 || ovest >=N || !empty(q))
{
q=equeue("O"); /*inserisco nella coda dei sensi*/
oktomove.wait(); /*aspetta*/
}
turn = 2; /*impongo il senso delle auto in circolo nel ponte */
ovest++;
}
}
procedure entry exit(char EoW)
{
char r;
if(EoW == "O")
{
est--;
r=tail(q);
if(est == 0 || r == "E")
{
est--;
if(est == 0) /*nessuna auto in transito nel ponte */
{
turn = 0; /*avanti un altro */
}
if(!empty(q))
{
q.dequeue();
oktomove.signal(); /*segnale*/
}
}
else
{
ovest--;
r=tail(q);
if(ovest == 0 || r == "O") /*nessuna auto in transito nel ponte */
{
turn = 0; /*avanti un altro */
}
if(!empty(q))
{
q.dequeue();
oktomove.signal(); /*segnale*/
}
}
}
}