Difference between revisions of "ProvaTeorica 2014.01.22"
Jump to navigation
Jump to search
| Line 81: | Line 81: | ||
------ | ------ | ||
| − | [[ | + | <syntaxhighlight lang="C"> |
| + | /* | ||
| + | * URL: http://www.cs.unibo.it/~renzo/so/compiti/2014.01.22.tot.pdf | ||
| + | * author: Tommaso Ognibene | ||
| + | */ | ||
| + | |||
| + | monitor bridge | ||
| + | { | ||
| + | condition okE; // attraversare in direzione Est | ||
| + | condition okW; // attraversare in direzione Ovest | ||
| + | int n = 0; // numero di veicoli sul ponte | ||
| + | int waitingE = 0; // numero di veicoli che attendono di attraversare in direzione Est | ||
| + | int waitingW = 0; // numero di veicoli che attendono di attraversare in direzione Ovest | ||
| + | bool toE = true; // direzione di attraversamento | ||
| + | |||
| + | procedure entry enter(Vehicle vehicle) | ||
| + | { | ||
| + | // [Case 1] il veicolo vuole attraversare in direzione Est | ||
| + | if (vehicle.From == 'E') | ||
| + | { | ||
| + | /* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure | ||
| + | - qualcuno sta attraversando in direzione opposta; oppure | ||
| + | - qualcuno sta attendendo di attraversare in direzione opposta */ | ||
| + | if (n == N || (!toE && n > 0) || (toE && waitingW > 0)) | ||
| + | { | ||
| + | // Mi fermo e attendo di essere sbloccato | ||
| + | waitingE++; | ||
| + | okE.wait(); | ||
| + | waitingE--; | ||
| + | } | ||
| + | toE = true; | ||
| + | n++; | ||
| + | /* Sblocco eventuali altri veicoli in attesa per la stessa direzione in modo | ||
| + | * da sfruttare la portata del ponte */ | ||
| + | okE.signal(); | ||
| + | } | ||
| + | // [Case 2] il veicolo vuole attraversare in direzione Ovest | ||
| + | else | ||
| + | { | ||
| + | /* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure | ||
| + | - qualcuno sta attraversando in direzione opposta; oppure | ||
| + | - qualcuno sta attendendo di attraversare in direzione opposta */ | ||
| + | if (n == N || (toE && n > 0) || (!toE && waitingE > 0)) | ||
| + | { | ||
| + | // Mi fermo e attendo di essere sbloccato | ||
| + | waitingW++; | ||
| + | okW.wait(); | ||
| + | waitingW--; | ||
| + | } | ||
| + | toE = false; | ||
| + | n++; | ||
| + | /* Sblocco eventuali altri veicoli in attesa per la stessa direzione in modo | ||
| + | * da sfruttare la portata del ponte */ | ||
| + | okW.signal(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | procedure entry exit(Vehicle vehicle) | ||
| + | { | ||
| + | n--; | ||
| + | /* Se nessuno sta attraversando il ponte */ | ||
| + | if (n == 0) | ||
| + | { | ||
| + | // [Case 1] l'ultimo ad attraversare andava in direzione Est | ||
| + | if (vehicle.From == 'E') | ||
| + | /* Attivo il veicolo che per primo si era messo | ||
| + | in attesa per attraversare in direzione Ovest */ | ||
| + | okW.signal(); | ||
| + | // [Case 2] l'ultimo ad attraversare andava in direzione Ovest | ||
| + | else | ||
| + | /* Attivo il veicolo che per primo si era messo | ||
| + | in attesa per attraversare in direzione Est */ | ||
| + | okE.signal(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
Revision as of 09:47, 17 March 2014
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*/
}
}
}
}
/*
* URL: http://www.cs.unibo.it/~renzo/so/compiti/2014.01.22.tot.pdf
* author: Tommaso Ognibene
*/
monitor bridge
{
condition okE; // attraversare in direzione Est
condition okW; // attraversare in direzione Ovest
int n = 0; // numero di veicoli sul ponte
int waitingE = 0; // numero di veicoli che attendono di attraversare in direzione Est
int waitingW = 0; // numero di veicoli che attendono di attraversare in direzione Ovest
bool toE = true; // direzione di attraversamento
procedure entry enter(Vehicle vehicle)
{
// [Case 1] il veicolo vuole attraversare in direzione Est
if (vehicle.From == 'E')
{
/* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure
- qualcuno sta attraversando in direzione opposta; oppure
- qualcuno sta attendendo di attraversare in direzione opposta */
if (n == N || (!toE && n > 0) || (toE && waitingW > 0))
{
// Mi fermo e attendo di essere sbloccato
waitingE++;
okE.wait();
waitingE--;
}
toE = true;
n++;
/* Sblocco eventuali altri veicoli in attesa per la stessa direzione in modo
* da sfruttare la portata del ponte */
okE.signal();
}
// [Case 2] il veicolo vuole attraversare in direzione Ovest
else
{
/* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure
- qualcuno sta attraversando in direzione opposta; oppure
- qualcuno sta attendendo di attraversare in direzione opposta */
if (n == N || (toE && n > 0) || (!toE && waitingE > 0))
{
// Mi fermo e attendo di essere sbloccato
waitingW++;
okW.wait();
waitingW--;
}
toE = false;
n++;
/* Sblocco eventuali altri veicoli in attesa per la stessa direzione in modo
* da sfruttare la portata del ponte */
okW.signal();
}
}
procedure entry exit(Vehicle vehicle)
{
n--;
/* Se nessuno sta attraversando il ponte */
if (n == 0)
{
// [Case 1] l'ultimo ad attraversare andava in direzione Est
if (vehicle.From == 'E')
/* Attivo il veicolo che per primo si era messo
in attesa per attraversare in direzione Ovest */
okW.signal();
// [Case 2] l'ultimo ad attraversare andava in direzione Ovest
else
/* Attivo il veicolo che per primo si era messo
in attesa per attraversare in direzione Est */
okE.signal();
}
}
}