Prova Teorica 2013.02.14
Jump to navigation
Jump to search
Esercizio 1
Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza BUFSIZE) che consenta a uno scrittore di scrivere contemporaneamente due elementi che andranno rispettivamente nel primo e nel secondo buffer. Le letture :
procedure entry void write(type1 e1, type2 e2);
procedure entry type1 read1();
procedure entry type2 read2();
La funzione write deve attendere che ci sia spazio in entrambi i buffer.
La funzione read attende che vi sia almeno un elemento nel buffer indicato.
// ------------------------- SOLUZIONE DI MV -------------------------
monitor dualwriter
{
type1 buf1[BUFSIZE];
type2 buf2[BUFSIZE];
int next_r1, next_r2, n1, n2;
// si ricorda che: next_w = (next_r+n)%BUFSIZE
condition notempty1, notempty2; // blocca in lettura se n=0
condition canwrite; // blocca in scrittura se n1=BUFSIZE || n2=BUFSIZE
dualwriter() // costruttore
{
n1 = n2 = next_r1 = next_r2 = 0;
}
procedure entry void write(type1 e1, type2 e2)
{
if(n1==BUFSIZE || n2==BUFSIZE)
canwrite.wait();
buf1[(next_r1+n1)%BUFSIZE] = e1;
n1++;
buf2[(next_r2+n2)%BUFSIZE] = e2;
n2++;
notempty1.signal();
notempty2.signal();
}
procedure entry type1 read1()
{
type1 el;
if(n1==0)
notempty1.wait();
el = buf1[next_r1];
next_r1 = (next_r1+1)%BUFSIZE;
n1--;
// libera un processo sse è possibile scrivere in entrambi i buffer
if(n1<BUFSIZE && n2<BUFSIZE)
canwrite.signal();
}
procedure entry type2 read2()
{
type2 el;
if(n2==0)
notempty1.wait();
el = buf2[next_r2];
next_r1 = (next_r1+1)%BUFSIZE;
n2--;
if(n1<BUFSIZE && n2<BUFSIZE)
canwrite.signal();
}
}