#include #include #include #include #include #include #define NBTH 4 #define NBLOOPS 4000 sem_t sem_ready; sem_t mutex; sem_t queue; int nb_stark=0; int nb_lannister=0; int alea() { return (rand()%10); } void lannister(int my_id) { sem_wait(&mutex); { while(nb_stark > 0) { /* il y a un homme, il faut attendre */ sem_post(&mutex); sem_wait(&queue); sem_wait(&mutex); } nb_lannister++; } assert(nb_lannister>0); assert(nb_stark==0); sem_post(&mutex); printf("Un Lannister (id=%d) entre\n", my_id); usleep(alea()); sem_wait(&mutex); assert(nb_lannister>0); assert(nb_stark==0); { nb_lannister--; if(nb_lannister == 0) sem_post(&queue); printf("Un Lannister (id=%d) sort\n", my_id); } sem_post(&mutex); } void stark(int my_id) { sem_wait(&mutex); { while(nb_lannister > 0) { /* il y a un Lannister, il faut attendre */ sem_post(&mutex); sem_wait(&queue); sem_wait(&mutex); } /* plus aucun Lannister en vue, on peut entrer */ nb_stark++; } assert(nb_stark>0); assert(nb_lannister==0); sem_post(&mutex); printf("Un Stark (id=%d) entre\n", my_id); usleep(alea()); sem_wait(&mutex); assert(nb_stark>0); assert(nb_lannister==0); { nb_stark--; if(nb_stark == 0) sem_post(&queue); printf("Un Stark (id=%d) sort\n", my_id); } sem_post(&mutex); } void* thread_func(void* arg) { int my_id = *(int*)arg; sem_post(&sem_ready); int i; for(i=0; i