#include #include #include #include #include #include #include #include #define NBMAXDOCS 5 #define MAXDIRNAME 80 /* ERREUR 3 : protection de nbDocIndexes */ pthread_mutex_t mutex; int nbDocIndexes = 0; int nbThreads = 0; char dirname[MAXDIRNAME]; /* Erreur 2: une zone memoire par thread */ char docname[NBMAXDOCS][MAXDIRNAME]; void *indexer_document(void *arg) { sleep(5); char *docname = (char *)arg; printf("Debut indexer document =%s\n", docname); sleep(1); printf("Fin indexer document =%s\n", docname); pthread_mutex_lock(&mutex); nbDocIndexes ++; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } void indexer_repertoire(DIR *dir) { /* ERREUR 2 */ struct dirent *entry; pthread_t thread; int rc, i = 0; do { entry = readdir(dir); if (entry == NULL) break; strcpy(docname[i], entry->d_name); nbThreads ++; /* ERREUR 2 */ rc = pthread_create(&thread, NULL, indexer_document, docname[i]); if (rc) { perror("pthread_create"); exit(EXIT_FAILURE); } i++; } while (i < NBMAXDOCS); if (i == NBMAXDOCS) { fprintf(stderr, "Interruption de l'indexation: le nombre de documents est superieur a NBMAXDOCS (%d)\n", NBMAXDOCS); } } int main(int argc, char **argv) { int i; DIR *directory; if (argc < 2) { fprintf(stderr, "Usage: %s listeRepertoires\n", argv[0]); exit(EXIT_FAILURE); } /* ERREUR 3 */ pthread_mutex_init(&mutex, NULL); for (i = 1; i < argc; i++) { assert(strlen(argv[i]) < MAXDIRNAME); strcpy(dirname, argv[i]); directory = opendir(dirname); if (directory == NULL) { perror("opendir"); exit(EXIT_FAILURE); } indexer_repertoire(directory); closedir(directory); } printf("Le nombre de threads crees est = %d\n", nbThreads); /* ERREUR 4 : le thread principal doit attendre la fin des autres threads avant l'affichage!!*/ printf("Le nombre de documents indexes est = %d\n", nbDocIndexes); /* ERREUR 3 */ pthread_mutex_destroy(&mutex); /* ERREUR 1 */ pthread_exit(NULL); }