** Предимство на читателите.
/* program readers_and_writers */
int readcount;
semaphore x = 1, wsem = 1;
void reader()
{ while (true) { wait(x); readcount++; if (readcount==1) wait(wsem); signal(x); READUNIT(); wait(x); readcount--; if (readcount==0) signal(wsem); signal(x); } } |
void writer()
{ while (true) { wait(wsem); WRITEUNIT(); signal(wsem); } }
|
** Предимство на писателите.
/* program readers_and_writers */
int readcount, writecount;
semaphore x = 1, y = 1, z = 1, wsem =
1, rsem = 1;
void reader()
{ while (true) { wait(z); wait(rsem); wait(x); readcount++; if (readcount==1) wait(wsem); signal(x); signal(rsem); signal(z); READUNIT(); /* {КС} */ wait(x); readcount--; if (readcount==0) signal(wsem); signal(x); } } |
void writer()
{ while (true) { wait(y); writecount++; if (writecount==1) wait(rsem); signal(y); wait(wsem); WRITEUNIT(); /* КС */ signal(wsem); wait(y); writecount--; if (writecount==0) signal(rsem); signal(y); } } |
Състояния на системата: | Състояния на семафорите wsem, rsem и z: |
Само читатели в системата |
- wsem - 1
- няма опашки |
Само писатели в системата |
- rsem - 1
- опашка от писатели на wsem |
Много читатели четат, идва писател |
- wsem е затворен (от първия читател); rsem е отворен;
- писателят минава и затваря rsem; - писателят чака на wsem; - следващият идващ читател затваря z и чака на rsem; - всички други идващи читатели чакат на z; - последният читател, завършил четенето, отваря wsem; |
Последен писател пише, чакат читатели |
- wsem е затворен (от пишещия писател);
- опашките са както в предишния случай; - писателят свършва и отваря wsem; - писателят отваря rsem; - читателят, чакащ на rsem минава, отваря z и чете; |