Sari la conținutul principal

Producător - Consumator

Problema se referă la două thread-uri: producător și consumator. Producătorul inserează date într-un buffer, iar consumatorul extrage date din acel buffer. Buffer-ul are o dimensiune prestabilită, astfel că:

  • producătorul nu poate insera date dacă buffer-ul este plin
  • consumatorul nu poate extrage date dacă buffer-ul este gol
  • producătorul și consumatorul nu pot acționa simultan asupra buffer-ului

O implementare corectă a problemei presupune asigurarea faptului că nu vor exista situații de deadlock, adică situații în care cele două thread-uri așteaptă unul după celălalt, neexitând posibilitatea de a se debloca.

Această problemă se poate rezolva în mai multe moduri (rezolvările sunt mai sus, în cadrul textului laboratorului):

  • folosind semafoare
  • folosind variabile condiție

Pseudocod - variante cu semafoare:

T[] buffer = new T[k];
semaphore gol(k);
semaphore plin(0);
mutex mutex;

producer(int id) {
T v;
while (true) {
v = produce();
gol.acquire();

mutex.lock();
buf.add(v);
mutex.unlock();

plin.release();
}
}

consumer(int id) {
T v;
while (true) {
plin.acquire();

mutex.lock();
v = buf.poll();
mutex.unlock();

gol.release();
consume(v);
}
}
CheatSheet Producer-Consumer