#include #include #include #include #include #include #include #include /* declaration des constantes */ #define TAILLE 100 /* declaration des semaphores */ sem_t MUTEX, VIDE, PLEIN; void * producteur (void*); void * consomateur (void*); /* declaration des variables patagées */ char tampon[BUFSIZ] ; int tailleCourante ; void * producteur (void * bidon) { for(;;) { sched_yield() ; sem_wait(&VIDE); sem_wait(&MUTEX); /* ecriture dans le tampon */ tampon[tailleCourante]='A'; tailleCourante++ ; printf("%s \n", tampon); sem_post(&MUTEX); sem_post(&PLEIN); } return NULL ; } void * consommateur (void *bidon) { int i ; for(;;) { sched_yield() ; sem_wait(&PLEIN); sem_wait(&MUTEX); printf("%s \n", tampon); for (i = 0; i < tailleCourante ; i++) { tampon[tailleCourante] = tampon[tailleCourante + 1] ; } tailleCourante--; sem_post(&MUTEX); sem_post(&VIDE); } return NULL ; } int main(void) { /* declaration des thread */ pthread_t tproducteur; pthread_t tconsomateur ; sem_init(&MUTEX,0,1); /* creation semaphore MUTEX */ sem_init(&PLEIN,0,0); /* creation semaphore PLEIN */ sem_init(&VIDE,0,TAILLE); /* creation semaphore VIDE */ /* creation du tread producteur*/ pthread_create(&tproducteur,NULL,producteur,NULL); /* creation du tread consomateur */ pthread_create(&tconsomateur,NULL,consommateur,NULL); sched_yield() ; /* On va bloquer le tread initial pour attendre la fin des thread */ pthread_join(tproducteur,NULL); pthread_join(tconsomateur,NULL); exit (0); }