Algoritmo de barbero durmiente (con múltiples barberos)

losProblema del barbero que duerme es un problema de sincronización clásico con el que muchos de ustedes están familiarizados o al menos escuchados.

Se basa en la premisa de que un barbero(un hilo) duerme cuando no hay clientes(cada cliente es un hilo) en la sala de espera(que es un semáforo). Si hay alguien, se corta el cabello (simbolizando algo de procesamiento) y el cliente se va. Si, entonces, no hay nadie en la sala de espera, el barbero se va a dormir. Cuando otro cliente llega, él debe despertar al barbero.

He hecho una implementación de esto usando la siguiente idea básica

(aunque el código actual está enC, Escribí lo siguientepseudocódigo sin mucho cuidado de la sintaxis por el bien de la comprensión de problemas, solo usandosem_wait ysem_post1 para una lectura más suave)

Semaphore Customers = 0;
Semaphore Barber = 0;
Mutex accessSeats = 1;
int NumberOfFreeSeats = N; 

Barber {
    while(1) {
        sem_wait(Customers); // waits for a customer (sleeps)
        sem_wait(accessSeats); // mutex to protect the number of available seats
        NumberOfFreeSeats++; // a chair gets free
        sem_post(Barber); // bring customer for haircut
        sem_post(accessSeats); // release the mutex on the chair
        // barber is cutting hair
    }
}

Customer {
    while(1) {
        sem_wait(accessSeats); // protects seats so only 1 thread tries to sit in a chair if that's the case
        if(NumberOfFreeSeats > 0) {
            NumberOfFreeSeats--; // sitting down
            sem_post(Customers); // notify the barber
            sem_post(accessSeats); // release the lock
            sem_wait(Barber); // wait in the waiting room if barber is busy
            // customer is having hair cut
        } else {
            sem_post(accessSeats); // release the lock
            // customer leaves
        }
   }
}

Sin embargo, ahora que implementaré este problema con múltiples barberos, mi cabeza se atascará. Fui a Wikipedia para ver si podía encontrar algo al respecto, pero lo único que encontré allí fue esto.

Un problema múltiple de barberos durmientes tiene la complejidad adicional de coordinar a varios barberos entre los clientes que esperan.

y no pude resolver esto por mi cuenta2.

¿Qué cambios tendría que hacer en mi código? ¿Dónde necesitaría un semáforo extra aquí?

1sem_wait() Bloquea el semáforo.sem_post() lo desbloquea
2Descargo de responsabilidad: Aunque he pedido esto enprogrammers.stackexchange además, no he alcanzado la respuesta deseada y mi pregunta aún persiste.

Respuestas a la pregunta(2)

Su respuesta a la pregunta