Bonjour!

Voilà, je suis entrain de lire le livre d'Andrew Tanenbaum (pour ceux qui connaissent) intitulé "Système d'exploitation" et il est question de trouver une solution au problème des boulangers posé de cette façon :

Dans une boulangerie, on a n boulangers. Les clients arrivent et doivent prendre un numéro. Un seul boulanger peut lire à un moment donné un numéro et servir le client correspondant; de même un client à la fois peut prendre un numéro. Le nombre de numéro est également limité et vaut N. On suppose qu'une fois le client appelé, l'action du boulanger se résume à la fonction ServirClient(). Ecrire en utilisant les sémaphores, des procédures pour les clients et des procédures pour les vendeurs
Dans le livre, pour ne pas être spécifique à un langage, on utilise les primitives Down et Up qui représentent les fonctions de manipulation des sémaphores (WaitForSingleObject et Release respectivement).

J'ai déjà cherché des algorithmes pour ce problème mais aucun ne me propose une solution vraiment efficace; de plus ce que j'ai écris ne semble pas marcher

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Semaphore mu=1; //une ressource disponible. mutex pour rendre l'action atomique
Semaphore Vendeur=n; //on a n vendeurs
Semaphore Client=1; //un client à la fois.
NombreNumero = 0; //nombre de numero déjà pris par les clients
 
void Client()
{
 while(1)
 {
  down(client);
  down(mutex); //pour s'assurer qu'un seul client pourra exécuter cette action
    PrendreNumero(); //action de prendre un numéro
    NombreNumero--; //le nombre de numéro dispo diminue
    si(NombreNumero==0) Up(Vendeur); //le nombre de numéro dispo vaut 0 donc on a tout pris alors on demande à un vendeur de lire
  up(mutex);
 }
}
 
void Vendeur
{
 while(1)
 {
  down(Vendeur);
  down(mutex); // j'utilise le même mutex pour être sûr qu'on ne pourra pas lire un numero pendant qu'un client en prend. 
    LireNumero(); //le vendeur lit un numero
    NombreNumero++;
    si(NombreNumero==N) //le nombre de numéro dispo = nombre de numéro total
        Up(Client); //on "reveille" le client
  up(mutex);
 }
}
Une boucle infinie parce qu'on suppose qu'on travaille à plein temps (personne ne dort ici )

Voilà, j'espère que vous pouvez un peu m'éclairer sur ce problème (des liens vers des cours, n'importe quoi).

Merci.