Salon de coiffure
On souhaite modéliser le comportement des clients et des coiffeurs dans un salon de coiffure. On considère que les clients et les coiffeurs ont leur propre flot de contrôle (ils s'exécutent dans des threads distincts). Un thread principal crée des clients qui se présentent à l'entrée du salon de coiffure. Lorsqu'un client arrive, il repart sans se faire coiffer si le salon est plein, sinon, il s'installe dans un fauteuil et attend son tour. Lorsque le coiffeur a terminé la coupe d'un client, il indique au client suivant que c'est son tour et lui coupe les cheveux. Le client attend que le coiffeur ait terminé, puis s'en va.

Premier modèle
En vous inspirant de l'exemple du producteur et du consommateur, modélisez le salon de coiffure en le considérant comme une file d'attente pour les clients. Votre programme principal devra créer un salon de coiffure disposant d'un certain nombre de fauteuils, un coiffeur travaillant dans ce salon, puis un certain nombre de clients en attendant un temps aléatoire entre chaque création de client. Le coiffeur prendra un temps aléatoire pour couper les cheveux d'un client.
Dans ce modèle, le programme principal est le producteur (même si ce sont les clients qui se placent dans la file d'attente lorsqu'il y a des fauteuils disponibles), et le coiffeur est le consommateur (c'est lui qui retire les clients de la file d'attente). Les principales différences par rapport au producteur-consommateur sont :
- un client ne reste jamais bloqué en attente d'un fauteuil car s'il n'y a pas de place, il repart sans se faire couper les cheveux ;
- une fois assis dans un fauteuil, le client attend que le coiffeur s'occupe de lui, puis attend que le coiffeur ait fini de lui couper les cheveux.
Un modèle plus complet
Dans la pratique, quand c'est le tour d'un client, ce dernier se lève de son fauteuil et vient s'installer dans le fauteuil de coupe du coiffeur. Modélisez l'acquisition et la libération de cette nouvelle ressource par le client. Vous pouvez aussi adapter votre code pour que plusieurs coiffeurs travaillent dans le même cabinet et puisent donc des clients dans la même file d'attente. Vérifiez bien que les clients n'attendent pas debout que le fauteuil de coupe se libère...
Pour finir
En réalité, quand aucun client n'est présent, le coiffeur ne reste pas figé à attendre. Modélisez le fait que si la file d'attente est vide, le coiffeur s'installe dans son fauteuil et s'endort. Il se réveillera lorsque de nouveaux clients arriveront. Le premier de ces clients devra attendre que le coiffeur ait libéré le fauteuil pour s'y installer.
Conseils
- Identifiez les ressources partagées afin de déterminer de quels sémaphores vous avez besoin.
- Choisissez soigneusement l'objet auquel appartient un sémaphore.
- N'accédez pas directement aux sémaphores gérés par un objet, définissez plutôt une méthode dont le nom indique le sens de l'action effectuée. Par exemple, si un client possède un sémaphore
coupe
indiquant si sa coupe est terminée, il ne faut pas que le coiffeur accède directement à ce sémaphore pour faire unrelease
dessus lorsqu'il a fini de coiffer un client. Il est préférable de doter les clients d'une méthodefinDeCoupe()
, qui sera appelée par le coiffeur, et qui en interne effectueracoupe.release()
. - Travaillez avec des modèles simples et de petite taille. Par exemple, 2 coiffeurs, 4 fauteuils et 10 clients suffisent largement lorsqu'on veut étudier l'imbrication des différents comportements. Faites varier le rapport entre le temps entre l'arrivée de deux clients et la durée d'une coupe afin d'explorer plus de possibilités.