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...") |
m (→Esercizio c.1:) |
||
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. |
Revision as of 14:17, 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(chiamato){
ok2call.wait();
if(ok2speak[chiamato].signal()) {
called[nome] = true;
return true;
}else return false;
}
procedure_entry boolean arrivato(nome){
if(called[nome]) return false;
else ok2speak[nome].wait();
return true;
}
procedure_entry void finepresentazione(nome){
ok2call.signal();
}
conf(){
for(int i = 0; i < N_SPEAKERS; i++) called[i] = false;
}
}