5.5 Задача за производител/потребител.
Един или няколко производители генерират данни (записи,
символи) и ги поставят в един буфер. Един потребител взема по една данна
от буфера. Само един агент (производител или потребител) има достъп да
буфера в даден момент.
--- FIGURE 5.11 ---
* Първи опит за решение със семафори:
/* program producer_consumer */
int n;
binary_semaphore s = 1;
binary_semaphore delay = 0;
void
producer()
{ while (true) { /*p1*/ produce(); /*p2*/ waitB(s); /*p3*/ append(); /*КС*/ /*p4*/ n++; /*p5*/ if (n==1) signalB(delay); /*p6*/ signalB(s); } } |
void consumer()
{ waitB(delay); while (true) { /*c1*/ waitB(s); /*c2*/ take(); /*КС*/ /*c3*/ n--; /*c4*/ signalB(s); /*c5*/ consume(); /*c6*/ if (n==0) waitB(delay); } } |
|
|
||||
|
|
|
|
||
|
|
|
|
|
p1->p2->p3->p4->p5->p6 |
|
|
|
|
|
|
|
|
|
|
|
c1->c2->c3->c4->c5-> |
|
|
|
|
|
p1->p2->p3->p4-> |
|
|
|
|
|
->c6 |
|
|
|
|
|
c1->c2->c3->c4->c5-> |
|
|
|
|
|
->c6 |
|
|
|
|
|
c1->c2-> !!! |
* Втори опит - решение:
int n;
binary_semaphore s = 1;
binary_semaphore delay = 0;
void producer()
{ while (true) { produce(); waitB(s); append();n++; if (n==1) signalB(delay); signalB(s); } } |
void consumer()
{ int m; /* a local variable */ waitB(delay); while (true) { waitB(s); take(); n--; m = n; signalB(s); consume(); if (m==0) waitB(delay); } } |