//1) Cas avec un unique récipient de n places (non demandé dans l'exercice) //1.1) Initialisation : un unique récipient de n places, vide Semaphore placesVides = n Semaphore produitsRestants = 0 //1.2) code Producteur wait(placesVides) //[produit] signal(produitsRestants) //1.3) code Consommateur wait(produitsRestants) //[consomme] signal(placesVides) //2) Cas avec 2 sous-récipients : // * sous-récipients A de a places (qui doit être rempli en premier et vidé en dernier, il symbolise le bas de la pile) // * sous-récipients B de b places (qui doit être rempli en dernier et vidé en premier, il symbolise le haut de la pile) //2.1) Initialisation //capacité max de A et B (renommés pour ne pas les confondre avec nbA et nbB) Entier capaA = a Entier capaB = b //nombre de produits dans A et B (à l'initialisation : 0) Entier nbA = 0 Entier nbB = 0 //initialisation : total de places dans les 2 sous-récipients Semaphore placesVides = capaA + capaB Semaphore produitsRestants = 0 //un seul processus à la fois pourra choisir dans quel récipient consommer ou produire (pour éviter les conflits au moment des tests) Semaphore choixRecipient = 1 //2.2) code Producteur //le producteur attend de pouvoir "réserver" une place vide (comme dans la version à 1 récipient) wait(placesVides) //si on arrive ici, on a réservé une place vide (A et B ne peuvent pas être pleins tous les 2) wait(choixRecipient) if(nbA < capaA) //si A n'est pas plein, on ajoute dans A nbA++ else //sinon, on ajoute dans B nbB++ //[produit] signal(produitsRestants) signal(choixRecipient) //2.3) code Consommateur //le consommateur attend de pouvoir "réserver" un produit (comme dans la version à 1 récipient) wait(produitsRestants) //si on arrive ici, on a réservé un produit (A et B ne peuvent pas être vides tous les 2) wait(choixRecipient) if(nbB > 0) //si B n'est pas vide, on prend dans B nbB-- else //sinon, on prend dans A nbA-- //[consomme] signal(placesVides) signal(choixRecipient)