/* * Problème des Lecteurs rédacteurs * bibliothèque pthread * Solution avec semaphores mutex uniquement * */ #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 */ #define NBTHREADS 6 int nbLecteurs = 0; /* -- A COMPLETER -- */ /* declarer les semaphores mutex */ /* Fonction principales des threads "redacteur" */ void * redacteur(void * arg) { char * nom = *(char **)arg; tprintf("debut thread redacteur %s\n", nom); /* -- A COMPLETER -- */ /* gerer la synchronisation lecteurs/redacteurs */ tprintf("%s ecrit...\n", nom); sleep(5+rand()%6); tprintf("%s : nbLecteurs=%i\n", nom, nbLecteurs); tprintf("%s a fini d ecrire...\n", nom); /* -- A COMPLETER -- */ /* gerer la synchronisation lecteurs/redacteurs */ 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); /* -- A COMPLETER -- */ /* gerer la synchronisation lecteurs/redacteurs */ tprintf("%s lit...\n", nom); sleep(1+rand()%3); tprintf("%s a fini de lire...\n", nom); /* -- A COMPLETER -- */ /* gerer la synchronisation lecteurs/redacteurs */ 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