Difference between revisions of "2017.07.17"
Jump to navigation
Jump to search
(Created page with "Pdf completo qui: [http://www.cs.unibo.it/~renzo/so/compiti/2017.07.17.tot.pdf 2017.07.17.tot.pdf] == Esercizio c.1: == <syntaxhighlight lang=c> In una conferenza il coordi...") |
|||
(One intermediate revision by the same user not shown) | |||
Line 2: | Line 2: | ||
− | + | =Esercizio c.1= | |
− | |||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
In una conferenza il coordinatore decide l’ordine degli oratori e li chiama uno ad uno per poter fare il proprio intervento. | In una conferenza il coordinatore decide l’ordine degli oratori e li chiama uno ad uno per poter fare il proprio intervento. | ||
Line 37: | Line 36: | ||
condition ok2call; | condition ok2call; | ||
− | procedure_entry boolean chiama(chiamato){ | + | procedure_entry boolean chiama(int chiamato){ |
ok2call.wait(); | ok2call.wait(); | ||
if(ok2speak[chiamato].signal()) { | if(ok2speak[chiamato].signal()) { | ||
Line 45: | Line 44: | ||
} | } | ||
− | procedure_entry boolean arrivato(nome){ | + | procedure_entry boolean arrivato(int nome){ |
if(called[nome]) return false; | if(called[nome]) return false; | ||
else ok2speak[nome].wait(); | else ok2speak[nome].wait(); | ||
Line 51: | Line 50: | ||
} | } | ||
− | procedure_entry void finepresentazione(nome){ | + | procedure_entry void finepresentazione(int nome){ |
ok2call.signal(); | ok2call.signal(); | ||
} | } | ||
− | conf(){ | + | conf(int N_SPEAKERS){ |
for(int i = 0; i < N_SPEAKERS; i++) called[i] = false; | for(int i = 0; i < N_SPEAKERS; i++) called[i] = false; | ||
} | } |
Latest revision as of 14:25, 9 May 2018
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;
}
}