E' un problema simile al produttore/consumatore solo che il consumatore in questo caso legge il dato ma non lo cancella. Le operazioni di scrittura devono essere fatte in mutua esclusione quelle di lettura anche in concorrenza anche se non durante le operazioni di scrittura.
Precedenza ai readers
Si può avere precedenza ai readers con la seguente soluzione:
Reader
wait(me);
nr++;
if(nr==1)
wait(w);
signal(me);
//lettura
wait(me);
nr--;
if(nr==0)
signal(w);
signal(me);
Writer
wait(me1);
wait(w);
//scrittura
signal(w)
signal(me1);
Precedenza ai writers
Reader
wait(me2);
wait(r);
wait(me);
nr++;
if(nr==1)
wait(w);
signal(me);
signal(r);
signal(me2);
//leggo
wait(me);
nr--;
if(nr==0)
signal(w);
signal(me);
Writer
wait(me1);
nw++;
if(nw==1)
wait(r);
signal(me1);
wait(w);
//scrivo
signal(w);
wait(me1);
nw--;
if(nw==0)
signal(r);
signal(me1);
Readers and writers in JAVA
Con le classi il problema dei Readers/writers potrebbe essere risolto nel seguente modo:
void start_read(void) {
nr++;
await(nw==0);
}
void start write(void) {
await (!busy&&nr==0);
nw++;
busy=TRUE;
}
void end_read(void) {
nr--;
}
void end_write(void) {
busy = FALSE;
nw--;
}
void init(void) {
busy=FALSE
nr+nw=0;
}
Per le immagini Ringraziamo ©frizztext
| < Prec. | Succ. > |
|---|






