Difference between revisions of "2017.09.11"
Jump to navigation
Jump to search
(Created page with "Pdf completo qui: [http://www.cs.unibo.it/~renzo/so/compiti/2017.09.11.tot.pdf 2017.09.11.tot.pdf] =Esercizio c1= <syntaxhighlight lang=c> Un semaforo intelligente controlla ...") |
(No difference)
|
Latest revision as of 17:51, 9 May 2018
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;
}
}