/* * Programme simulant la gestion d'une imprimante */ #include #include #include #include #include #include #define MAXNBIMPRESSIONS 5 #define MAXNBTHREADS 3 char nomFic[MAXNBIMPRESSIONS][80]; int i_depot=0; int i_extrait = 0; struct monitor{ int value; pthread_mutex_t mutex; pthread_cond_t cond; }; void init_monitor(struct monitor *m, int value) { m->value = value; pthread_mutex_init(&m->mutex, NULL); pthread_cond_init(&m->cond, NULL); } struct monitor places_dispo; struct monitor info_prete; 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* thread_function(void* arg) { char nomFic_local[80]; while(1) { pthread_mutex_lock(&info_prete.mutex); while(info_prete.value == 0) { pthread_cond_wait(&info_prete.cond, &info_prete.mutex); } info_prete.value--; strncpy(nomFic_local, nomFic[i_extrait], 80); i_extrait = (i_extrait+1) % MAXNBIMPRESSIONS; pthread_mutex_unlock(&info_prete.mutex); if(strcmp(nomFic_local, "0") == 0) return NULL; impression(nomFic_local); pthread_mutex_lock(&places_dispo.mutex); places_dispo.value ++; pthread_cond_signal(&places_dispo.cond); pthread_mutex_unlock(&places_dispo.mutex); } return NULL; } void attenteImpression(){ do { pthread_mutex_lock(&places_dispo.mutex); while(places_dispo.value == 0) { pthread_cond_wait(&places_dispo.cond, &places_dispo.mutex); } places_dispo.value--; int cur_indice = i_depot++; i_depot = i_depot % MAXNBIMPRESSIONS; pthread_mutex_unlock(&places_dispo.mutex); printf("Nom du fichier a imprimer (taper '0' pour terminer) ? "); scanf("%s", nomFic[cur_indice]); if (strcmp(nomFic[cur_indice], "0") == 0) { break; } pthread_mutex_lock(&info_prete.mutex); info_prete.value ++; pthread_cond_signal(&info_prete.cond); pthread_mutex_unlock(&info_prete.mutex); }while (1); for(int i=0; i