Difference between revisions of "Prova Teorica 2013.02.14"
Jump to navigation
Jump to search
(Created page with "==Esercizio 1== <source lang="text"> Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza BUFSIZE) che consenta a uno scrittore di sc...") |
|||
Line 47: | Line 47: | ||
notempty1.wait(); | notempty1.wait(); | ||
− | el = buf1[next_r1+ | + | el = buf1[next_r1]; |
+ | next_r1 = (next_r1+1)%BUFSIZE; | ||
n1--; | n1--; | ||
Line 62: | Line 63: | ||
notempty1.wait(); | notempty1.wait(); | ||
− | el = buf2[next_r2+ | + | el = buf2[next_r2]; |
+ | next_r1 = (next_r1+1)%BUFSIZE; | ||
n2--; | n2--; | ||
Revision as of 17:58, 26 May 2015
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();
}
}