Sleeping Barber-Algorithmus (mit mehreren Barbieren)

DasProblem mit dem schlafenden Barbier ist ein klassisches Synchronisationsproblem, mit dem viele von Ihnen vielleicht vertraut sind oder von dem sie zumindest gehört haben.

Es basiert auf der Prämisse, dass ein Friseur(ein Thread) schläft, wenn es keine Kunden gibt(jeder Kunde ist ein Thread) im Wartezimmer(das ist ein Semaphor). Wenn jemand da ist, schneidet er sich die Haare (als Symbol für eine Verarbeitung) und der Kunde geht. Wenn sich dann niemand im Wartezimmer befindet, geht der Friseur schlafen. Wenn ein anderer Kunde ankommt, muss er den Friseur wecken.

Ich habe dies mit der folgenden Grundidee umgesetzt

(obwohl der eigentliche Code in istCIch habe folgendes geschriebenPseudocode ohne viel Sorgfalt für die Syntax aus Gründen des Problem-Understading, nur mitsem_wait undsem_post1 für flüssigeres Lesen)

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
        }
   }
}

Da ich dieses Problem jetzt jedoch bei mehreren Friseuren implementieren werde, blieb mein Kopf stecken. Ich ging auf Wikipedia, um zu sehen, ob ich etwas darüber finden konnte, aber das einzige, was ich dort fand, war dieses

Ein Problem mit mehreren schlafenden Barbieren hat den zusätzlichen Aufwand, mehrere Barbiere unter den wartenden Kunden zu koordinieren.

und ich konnte das nicht alleine herausfinden2.

Welche Änderungen müsste ich an meinem Code vornehmen? Wo brauche ich hier ein zusätzliches Semaphor?

1sem_wait() sperrt das Semaphor.sem_post() Schaltet es frei
2Haftungsausschluss: Obwohl ich dies in gefragt habeprogrammers.stackexchange Außerdem habe ich keine gewünschte Antwort gefunden und meine Frage bleibt bestehen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage