ProvaTeorica 2012.09.18
Revision as of 19:03, 16 March 2014 by Stefano 92 (talk | contribs) (Created page with "Esercizio 1 <syntaxhighlight lang="C"> /* Esercizio c.1: Per lo scopo di questo esercizio si ipotizzi la presenza di infiniti processi che si vogliono sincronizzare a tre a t...")
Esercizio 1
/*
Esercizio c.1: Per lo scopo di questo esercizio si ipotizzi la presenza di infiniti processi che si vogliono sincronizzare a
tre a tre sulla base di un contrassegno numerico (tag).
Ogni processo chiama la procedura di ingresso syn3 del monitor three (three.syn3) passando come parametro (in
input) un contrassegno numerico floating point (double) e un array di tre indentificativi di processo (in output).
Monitor three:
Procedure entry void syn3(double tag, pid_t proc[3])
….
Solo quando tre processi hanno chiamato la syn3 specificando lo stesso valore per tag posso proseguire nella
computazione. Il vettore proc conterra' gli identificativi dei tre processi (ogni processo quindi conoscera'
l'identificativo degli altri due che hanno consentito di proseguire).
Se per esempio il processo P1 richiama syn3 con il valore 3.14, poi P2 con 1.41, P3 con 2.71, P4 con 3.14, se a questo
punto arriva un processso P5 che chiama syn3 con valore 3.14 sblocca P1, P4 e P5 (P2 e P3 rimarranno in attesa che
altri processi richiamino syn3 con 1.41 o con 2.71). P1, P4 e P5 riceveranno nel vettore proc gli identificativi di P1, P2
e P4.
typedef struct waiting_q
{
double tag;
condition oktogo;
p_id* waiting_process=Stack();
} waiting_q;
*/
monitor three
{
waiting_q* code=Stack(); /*pila di waiting_q*/
procedure entry void syn3 (double val, pid_t proc[3])
{
waiting_q* local=code.searchByTag(val);
if (!local)
{
waiting_q* tmp=new waiting_q;
tmp->tag=val;
tmp->waiting_process.push(this->p_id);
waiting_q.push(tmp);
tmp->oktogo.wait()
while (!isEmpty(local.waiting_process))
{
local->waiting_process.pop();
local->oktogo.signal();
}
}
else
{
if (local->waiting_process.size()!=2)
{
local->waiting_process.push(this->p_id);
local->oktogo.wait();
}
}
while (!isEmpty(local.waiting_process))
{
local->waiting_process.pop();
local->oktogo.signal();
}
}
}
-stefano92