/* * Problème des Lecteurs rédacteurs * bibliothèque pthread * Solution avec moniteurs (mutex et conditions) * */ #include #include #include #include #include #include "macros-thread.h" #include "tprintf.h" /* Modifier ici la chaine de lancement des threads */ #define NBTHREADS 6 #define STARTING_CHAIN {"w1","r1", "r2", "r3", "w2", "r4"} /* Notions Globales */ /* Définition du moniteur: variables d'état, mutex, conditions */ /* ----------------------------------------------------------- */ int nbLecteurs=0; /* Ressource Critique */ int nbRedacteurs=0; /* Ressource Critique */ /* -- A COMPLETER -- */ /* declarer mutex et conditions pour le moniteur */ /* Points d'entrée du moniteur proteges par E.M.*/ void m_prologue_lecteur(char *); void m_epilogue_lecteur(char *); void m_prologue_redacteur(char *); void m_epilogue_redacteur(char *); /* Fonctions du moniteur */ void m_prologue_lecteur(char * nom) { /* -- A COMPLETER -- */ /* Section à mettre en Exclusion Mutuelle */ /* par ex: tprintf("producteur %s demande P(mutex)...\n", nom); P_MUTEX(mutex); tprintf("producteur %s obtient P(mutex)...\n", nom); */ /* code en E.M. sur mutex */ /* -- A COMPLETER -- */ /* gerer la synchronisation lecteurs/redacteurs */ nbLecteurs ++; /* fin d'E.M. */ /* -- A COMPLETER -- */ /* Mettre fin à la section en Exclusion Mutuelle */ } void m_epilogue_lecteur(char * nom) { /* -- A COMPLETER -- */ /* Section à mettre en Exclusion Mutuelle */ /* code en E.M. sur mutex */ /* -- A COMPLETER -- */ /* gerer la synchronisation lecteurs/redacteurs */ nbLecteurs --; /* fin d'E.M. */ /* -- A COMPLETER -- */ /* Mettre fin à la section en Exclusion Mutuelle */ } void m_prologue_redacteur(char * nom) { /* -- A COMPLETER -- */ /* Section à mettre en Exclusion Mutuelle */ /* code en E.M. sur mutex */ /* -- A COMPLETER -- */ /* gerer la synchronisation lecteurs/redacteurs */ nbRedacteurs=1; /* fin d'E.M. */ /* -- A COMPLETER -- */ /* Mettre fin à la section en Exclusion Mutuelle */ } void m_epilogue_redacteur(char * nom) { /* -- A COMPLETER -- */ /* Section à mettre en Exclusion Mutuelle */ /* code en E.M. sur mutex */ /* -- A COMPLETER -- */ /* gerer la synchronisation lecteurs/redacteurs */ nbRedacteurs=0; /* fin d'E.M. */ /* -- A COMPLETER -- */ /* Mettre fin à la section en Exclusion Mutuelle */ } /* fin de definition du moniteur */ /* ----------------------------- */ /* Fonction principales des threads "redacteur" */ void * redacteur(void * arg) { char * nom = *(char **)arg; tprintf("debut thread redacteur %s\n", nom); m_prologue_redacteur(nom); tprintf("%s ecrit...\n", nom); sleep(5+rand()%6); tprintf("%s etat du tampon partage: nbLecteurs=%i\n", nom, nbLecteurs); tprintf("%s a fini d ecrire...\n", nom); m_epilogue_redacteur(nom); tprintf("fin thread redacteur %s\n", nom); pthread_exit(EXIT_SUCCESS); } /* Fonction principales des threads "lecteur" */ void * lecteur(void * arg) { char * nom = *(char **)arg; tprintf("debut thread lecteur %s\n", nom); m_prologue_lecteur(nom); tprintf("%s lit...\n", nom); sleep(1+rand()%3); tprintf("%s a fini de lire...\n", nom); m_epilogue_lecteur(nom); tprintf("fin thread lecteur %s\n", nom); pthread_exit(EXIT_SUCCESS); } /* Affichage de la chaine de lancement des threads */ char * chaine_lancement(char * nomsThreads[], char * sep) { static char starting_chain[3*NBTHREADS+1]=""; strcat(starting_chain, nomsThreads[0]) ; for ( int i=1; i