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;
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 semblerait toutefois que ce que j'ai fais ici ne soit pas bon.

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