2017.07.17
Pdf completo qui: 2017.07.17.tot.pdf
Esercizio c.1
In una conferenza il coordinatore decide l’ordine degli oratori e li chiama uno ad uno per poter fare il proprio intervento.
Se l’oratore arriva in ritardo (non sta attendendo al momento della chiamata) perde il diritto di poter parlare.
Coordinatore: process
while True:
chiamato = next(); //next è la funzione che restituisce il nome del prossimo oratore
print(“Chiamo ora a parlare “,chiamato);
if (conf.chiama(chiamato))
print(“ringrazio “, chiamato,” per la relazione”);
else
print(“mi dispiace che “, chiamato, “non sia presente”);
Oratore[nome]: for nome in set_of_speakers
if conf.arrivato(nome):
//presentazione
conf.finepresentazione(nome)
Scrivere il monitor conf.
La funzione chiama aspetta che il relatore chiamato abbia completato l’intervento, se prensente, e restituisce vero altrimenti restituisce falso.
La funzione arrivato segnala la presenza e pone il relatore in attesa del proprio turno.
Se il relatore è già stato chiamato ed era assente restituisce falso.
Soluzione proposta 1
Monitor conf{
boolean called[N_SPEAKERS];
condition ok2speak[N_SPEAKERS];
condition ok2call;
procedure_entry boolean chiama(int chiamato){
ok2call.wait();
if(ok2speak[chiamato].signal()) {
called[nome] = true;
return true;
}else return false;
}
procedure_entry boolean arrivato(int nome){
if(called[nome]) return false;
else ok2speak[nome].wait();
return true;
}
procedure_entry void finepresentazione(int nome){
ok2call.signal();
}
conf(int N_SPEAKERS){
for(int i = 0; i < N_SPEAKERS; i++) called[i] = false;
}
}