Bonjour,
je poste dans ce topic car je ne vois pas d'autre forums pour accueillir la question. Pardon s'il y a plus adapté.
Mais pour être clair, ma question ne concerne pas une implémentation du moniteur en C directement avec des les mutex posix; mais bien la théorie générale des moniteurs dans laquelle on s'accorde à dire qu'il y a exclusion mutuelle de base.
Bref, voici l'énoncé:
On considère des processus producteurs et consommateurs qui partagent, sans perte de messages,
une boîte à lettres circulaire de taille N.
Dans la première variante considérée, les producteurs et les consommateurs utilisent la boîte à
lettres au travers des deux opérations : Put et Get.
o Put(m) dépose le message m dans une nouvelle case de la boîte à lettres;
et Get(&m) retourne le message m à l'appelant et la case contenant m devient vide.
Donner le code (en pseudo-code algorithmique) du moniteur permettant la synchronisation
souhaitée. Pour cela :
--> Donner l'interface du moniteur mettant à disposition les opérations permettant aux deux
types de processus mis en jeu de synchroniser leurs accès à la boîte à lettres partagée selon
les contraintes imposées.
--> Exprimer les conditions de blocage/déblocage des deux types de processus voulant accéder
à la boîte à lettres. En déduire les variables d'état et les variables « condition » utilisées dans
le moniteur.
--> Donner le code des algorithmes des opérations que le moniteur met à disposition.
Ce que j'ai fais:
* Spécification du moniteur
ecrireDansBoite(int iBoite, Message m)
lireDansBoite(int iBoite, Message *m)*Condition blocage deblocage
Un producteur est bloqué si la boite au lettre est pleine (iBoite = N)
Un conso est bloqué si la boite au lettre est vide (iBoite =0)
Un producteur est débloqué par un consommateur terminant de lire (iBoite < N)
Un consommateur est débloqué par un producteur terminant d'écrire (iBoite > 0)
Condition accesBoiteConso;
Condition accesBoiteProd;
iBoite;Il semblerait toutefois que ce que j'ai fais ici ne soit pas bon.
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 *code moniteur initialisation(){ iBoite = 0; } ecrireDansBoite(int iBoite,Message m){ if(iBoite==N){ accesBoiteProd.wait(); } put(m); iBoite++: accesBoiteConso.signal(); } lireDansBoite(int iBoite,Message *m){ if(iBoite==0){ accesBoiteConso.wait(); } get(&m); iBoite--; accesBoiteProd.signal(); }
Il y a vraisemblablement deux problèmes bien connus (Producteurs / Consommateurs et Lecteur/Rédacteurs) et j'ai apparemment utilisé le mauvais ici d'après ce que l'on me dit, mais je ne comprends pas pourquoi.
Quelqu'un pourrait-il m'expliquer ?
Merci à vous
Partager