Salut à tous,
J'essaie de prendre de l'avance sur l'année qui vient, notamment en Java et plus précisément sur les threads ; j'ai déjà sollicité plusieurs fois votre aide pour corriger ou valider des sources que j'ai écrites dans le cadre d'un TP, cette fois-ci (et ce sera mon dernier topic au sujet des threads d'ailleurs) je souhaiterais vous demander de l'aide pour comprendre un algorithme.
Il s'agit de l'algorithme du système lecteurs-rédacteurs, avec priorité des rédacteurs sur les lecteurs.
Le prof a écrit cet algorithme, mais sans donner d'explication ; aussi je le trouve long et plutôt "mystérieux". J'ai mis sous forme graphique cet algorithme (je trouve que c'est bien plus clair, et je procède ainsi systématiquement depuis quelques jours, dès que je me trouve face à des threads).
Dans le TP, je n'ai qu'un seul rédacteur et un seul lecteur qui travaillent sur une même donnée, et qui peuvent s'exécuter en même temps. Cependant je pense que l'algo que je viens de vous fournir marche avec plusieurs Rédacteurs et plusieurs Lecteurs, donc il est généralisant.
Voilà, autant j'ai bien compris le fonctionnement des algos "producteur-consommateur" et même "lecteur-rédacteur avec priorité du lecteur", autant celui-ci me paraît beaucoup plus long et complexe… Je suis perdu entre tous ces "DL, DR", ces conditions, tout ça…
Si quelqu'un est dispo pour m'aider, ce serait sympa !
Merci et bonne journée !
EDIT : Algorithme version rédigée.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | static int lecteur,demandeLecteur; // nombre de lecteurs static int redacteur,demandeRedacteur; semaphore mutex; // protection des variables semaphore semLec; semaphore semRed; void initialisation() { Init(& mutex,1); Init(& semLec,0); Init(& semRed,0); lecteur=0; demandeLecteur=0; redacteur=0; demandeRedacteur =0; } void lecteur(void) { P(&mutex); // accès aux variables protégées if (redacteur || demandeRedacteur) // teste s'il y a un rédacteur ou // une demande d'un rédacteur demandeLecteur++; V(&mutex) P(&semLec); P(&mutex) demandeLecteur--; lecteur++; V(&mutex); ACCES A L'INFORMATION P(&mutex); lecteur--; if (lecteur == 0 && demandeRedacteur) // seul lecteur V(&semRed);// libère le rédacteur V(&mutex); } void redacteur(void) { P(&mutex); // demande aux variables if (lecteur||redacteur || demandeRedacteur){ demandeRedacteur++ V(&mutex) P(&semRed); P(&mutex) DemandeRedacteur --; } redacteur ++; V(&mutex) PRODUIRE L'INFO P(&mutex) redacteur --; if (demandeRedacteur) V(&semRed) else { if (demandeLecteur) { int nb; for (nb=0;nb < demandeLecteur, nb++) V(&semLec); } } V(&mutex); } |