/* * Programme simulant la gestion d'une imprimante * * Paradigme d'exclusion mutuelle. * * Utilisation de mutex * */ #include #include #include #include #include #include #define NBMAXTHREADS 100 #define NOMFICHIERMAX 80 pthread_mutex_t mutex; void impression(char *nomFic){ pthread_mutex_lock(&mutex); printf("Debut d'impression de \"%s\"...\n", nomFic); sleep(5); /* Simule la lenteur de l'impression */ printf("...Fin d'impression de \"%s\"...\n", nomFic); pthread_mutex_unlock(&mutex); } void *imprimeur(void *args) { char *nomFic; nomFic = (char *)args; impression(nomFic); free(nomFic); pthread_exit(NULL); } int main(){ int i; pthread_t threadTab[NBMAXTHREADS]; int nbThreads = 0; pthread_mutex_init(&mutex, NULL); do { int retcode; char *nomFic; nomFic = malloc(NOMFICHIERMAX * sizeof(char)); if (nomFic == NULL) { perror("malloc"); exit(EXIT_FAILURE); } printf("Nom du fichier a imprimer (taper '0' pour terminer) ? "); scanf("%s", nomFic); if (strcmp(nomFic,"0") == 0) { break; } retcode = pthread_create(&(threadTab[nbThreads]), NULL, imprimeur, nomFic); if (retcode != 0) { perror("pthread_create"); exit(EXIT_FAILURE); } nbThreads ++; } while (nbThreads < NBMAXTHREADS); printf("Au revoir\n"); for (i = 0; i < nbThreads; i ++) pthread_join(threadTab[i], NULL); pthread_mutex_destroy(&mutex); return EXIT_SUCCESS; }