Sari la conținutul principal

Problema bărbierului

Avem următoarea situație: avem o frizerie cu un bărbier (un thread), un scaun de bărbier, N scaune de așteptare și M clienți (M thread-uri).

La această problemă avem următoarele constrângeri:

  • bărbierul doarme atunci când nu sunt clienți
  • când vine un client, acesta fie trezește bărbierul, fie așteaptă dacă bărbierul este ocupat
  • dacă toate scaunele sunt ocupate, clientul pleacă

Pseudocod:

int freeChairs = N;
semaphore clients(0);
semaphore barber_ready(0);
semaphore chairs(1); // sau mutex

barber() {
while(true) {
clients.acquire(); // se caută client; dacă există, el este chemat

chairs.acquire(); // are client, un scaun este eliberat, modificăm freeChairs

freeChairs++; // scaun eliberat

barber_ready.release(); // bărbierul e gata să tundă
chairs.release(); // freeChairs modificat

// tunde bărbierul
}
}

client(int id) {
while(true) {
chairs.acquire(); // vine un client și caută un scaun liber
if (freeChairs > 0) {
freeChairs--; // clientul a găsit scaun

clients.release(); // bărbierul știe că s-a ocupat un scaun de un client

chairs.release(); // freeChairs modificat

barber_ready.acquire(); // clientul își așteaptă rândul la tuns
} else {
// nu sunt scaune libere
chairs.release();
// clientul pleacă netuns
}
}
}