Prova Teorica 2007.09.07
Jump to navigation
Jump to search
TESTO COMPITO
CONCORRENZA
Esercizio 1
Monitor fabbrica
{
Queue ruote, scocche;
Condition produttoreRuota, produttoreScocca, assemblatore;
void deposita_ruota(Ruota r)
{
if (ruote.Count == 64)
produttoreRuota.wait();
ruote.enqueue(r);
if (ruote.Count >= 4 && scocche.Count >= 1)
assemblatore.signal();
}
void deposita_scocca(Scocca s)
{
if (scocche.Count == 8)
produttoreScocca.wait();
scocche.enqueue(s);
if (ruote.Count >= 4)
assemblatore.signal();
}
void preleva_pezzi(Ruota r[4], Scocca *s)
{
if (ruote.Count < 4 || scocche.Count < 1)
assemblatore.wait();
for (int i = 0; i < 4; i++)
r[i] = ruote.dequeue();
*s = scocche.dequeue();
for (int i = 0; i < 4; i++)
produttoreRuota.signal();
produttoreScocca.signal();
}
}
Esercizio 2
// (1) Yes, it is possible.
void nbSend(Message msg, Pid dst)
{
asend(<msg, getpid()>, dst);
}
Message nbReceive(Pid src)
{
Message fake = Message();
asend(fake, getpid());
<msg, pid> = areceive(*);
return (pid == src)? msg : NULL;
}
// (2) Yes, it is possible, but it requires busy waiting.
void aSend(Message msg, Pid dst)
{
nbsend(msg, dst);
}
Message aReceive(Pid sender)
{
Message msg;
// Blocking effect through busy waiting
while (!(msg = nbreceive(sender)));
return msg;
}