#include #include #include #include #define FATAL(msg) {\ char m[128]; \ sprintf(m, "%s in %s:%d:%s", msg, __FILE__, __LINE__, __func__); \ perror(m); \ abort(); \ } pthread_mutex_t mutexDepot; pthread_mutex_t mutexRetrait; pthread_cond_t condDepot; pthread_cond_t condRetrait; int placeDispo=4; int infoPrete=0; int iDepot=0; int iExtrait=0; int plateau[]={0,0,0,0}; void *nain(void *args){ int num = (int)args; do{ printf("Nain %d : Je travaille\n", num); sleep(1); printf("Nain %d : Je prends ma pause\n", num); // On tente de prendre le verre pthread_mutex_lock(&mutexRetrait); while(infoPrete == 0){ pthread_cond_wait(&condRetrait, &mutexRetrait); } infoPrete--; plateau[iExtrait] = 0; iExtrait = (iExtrait + 1) % 4; pthread_mutex_unlock(&mutexRetrait); pthread_mutex_lock(&mutexDepot); placeDispo++; pthread_mutex_unlock(&mutexDepot); pthread_cond_signal(&condDepot); // On a reussi : on peut donc continuer printf("Nain %d : Je prends un verre plein sur le plateau\n", num); printf("Nain %d : Je bois cul sec !\n", num); } while (1); } void *mesange(void *args){ int num = (int)args; do{ printf("Mésange %d : Je prends un verre plein chez Mère-Grand, je vais à la mine et j'attends de pouvoir le déposer sur le plateau\n", num); // On tente de déposer le verre pthread_mutex_lock(&mutexDepot); while (placeDispo == 0) { pthread_cond_wait(&condDepot, &mutexDepot); } placeDispo--; plateau[iDepot] = 1; iDepot = (iDepot + 1) % 4; pthread_mutex_unlock(&mutexDepot); pthread_mutex_lock(&mutexRetrait); infoPrete++; pthread_mutex_unlock(&mutexRetrait); pthread_cond_signal(&condRetrait); // On a reussi : on peut donc continuer printf("Mésange %d : Je dépose le verre sur le plateau\n", num); }while(1); } int main() { pthread_t t; int i; // Initialisation des mutex et des conditions pthread_cond_init(&condDepot, NULL); pthread_cond_init(&condRetrait, NULL); pthread_mutex_init(&mutexDepot, NULL); pthread_mutex_init(&mutexRetrait, NULL); // Démarrage de tous les nains for (i=1 ; i<=7 ; i++){ if (pthread_create(&t, NULL, nain, (void *)i) < 0){ FATAL("Creation nain"); } } // Démarrage de toutes les mésanges for (i=1 ; i<=8 ; i++){ if (pthread_create(&t, NULL, mesange, (void *)i) < 0){ FATAL("Creation mésange"); } } // On attend la dernière thread créée pour ne pas sortir du programme pthread_join(t,NULL); return EXIT_SUCCESS; }