2017.09.11
Jump to navigation
Jump to search
Pdf completo qui: 2017.09.11.tot.pdf
Esercizio c1
Un semaforo intelligente controlla un incrocio al quale si può accedere da 4 direzioni N, E, S, W.
Un solo veicolo alla volta deve occupare l’area dell’incrocio.
Se sono presenti veicoli da tutte le direzioni, il semaforo fa avanzare ciclicamente un veicolo da ogni direzione (NESWNESWNESW…).
Se nessun veicolo è in attesa da una direzione, il turno viene saltato.
Quella che segue è la porzione di di programma eseguita dai veicoli per passare attraverso l’incrocio:
crossing.enter(direction)
…critical section
crossing.exit(direction)
Nonostante sia un semaforo, questo esercizio deve venir risolto coi monitor.
Soluzione proposta 1
monitor crossing{
enum direction = {N, E, S, W};
condition ok2cross[4];
boolean busy;
int waiting[4];
procedure_entry void enter(enum direction d){
waiting[d]++;
if(waiting[d] > 1) ok2cross[d].wait();
busy = true;
waiting[d]--;
}
procedure_entry void exit(enum direction d){
busy = false;
for(int i = 1; i < 5; i++){
if(waiting[(d + i) % 4]) ok2cross[(d + i) % 4].signal();
}
}
crossing(){
for(int i = 0; i < 4; i++) waiting[i] = 0;
busy = false;
}
}