juin
2011
On aura besoin de trois sémaphores pour protéger l’accès aux ressources partagées :
coiffeur : pour l’accès au coiffeur.
client : pour l’accès aux clients.
mutex : un sémaphore pour l’accès en exclusion mutuelle sur la variable partagée NbClientsEnAttente.
Exemple d’algorithme pour le problème du coiffeur fatigué :
initialisations :
sémaphore présence_client = 0 ; // le coiffeur dort au début; il est fatigué!
sémaphore coiffeur = 1 ; // pas de clients au début. Le coiffeur est disponible de suite.
Mais attention, il va falloir le réveiller!
sémaphore mutex = 1 ; // la variable NbClientsEnAttente est accesssible
entier NbClientsEnAttente = 0 ; // pas de clients au début
Processus coiffeur :
while (TRUE) {
//Le coiffeur demande une ressource appelée présence_client.
// Si un client est présent, il doit se réveiller. Sinon il poursuit sa sieste.
P(présence_client) ;
// A ce stade, le coiffeur est réveillé. Mais dans quel état?!
//On doit accéder la variable NbClientsEnAttente
//Si elle est prise, on attend. Sinon, on la décrémente car le client va quitter son siège //qui devient libre.
P(mutex) ;
// La variable est libérée. On décrémente.
NbClientsEnAttente=NbClientsEnAttente-1 ;
// le coiffeur est prêt à prendre en charge un client de la file d’attente.
V(coiffeur) ;
// Il doit libérer NbClientsEnAttente
Coiffer() ;
}
Processus Client :
//un client qui arrive doit vérifier si tous les sièges sont pris.
// Il doit accéder à NbClientsEnAttente.
P(mutex) ;
//Vérifier s’il y a de la place ou pas.
if (NbClientsEnAttente < N) {
//il y a une place. Le client la prend mais doit incrémenter NbClientsEnAttente.
NbClientsEnAttente=NbClientsEnAttente+1 ;
// Une nouvelle ressource présence_client est disponible pour le coiffeur.
// C’est une manière de signaler votre présence au coiffeur.
V(présence_client) ;
// On doit libérer NbClientsEnAttente
V(mutex) ;
// Le client est pris en compte dans la file d’attente du coiffeur. Chacun à son tour !
}
Else {
// Tous les sièges sont occupés. Le client libère NbClientsEnAttente
//Le client s’en va.
}
}