//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)