crvmj | Exercice :
on reprend le probléme du producteur consommateur ,vu dans le cours(en généralisant le probléme a plusieurs proucteurs et consommaturs).
Tappel du probléme:
-N_C processus consommateurs accédant a un tampon partagé (tampon) lui-même remplit par N_P processus producteurs.
-les processus consommateurs lisent dans le tampon en détruisant la valeur lue (libérationd'une casedu tampon).
-les processus producturs écrivetn dan le tampon en ajoutant une valeur(remplissage d'une case du tampon).
on urilizera trois sémaphores :
* vide, initialisé a N(le nombre de cases vides),
* plein, initialisé a 0(le nombre de cases pleines)
*mutex pour grantir l'exclusion mutuelle sur le tampon
Résoudre ce probléme en utilisant des threads et des sémaphores
Remarque : la taille de tampon est 6 , utiliser 10 prod et 8 conso
voici mon code:
Code :
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<pthread.h>
- #include<semaphore.h>
- #include <string.h>
- #include <stdio.h>
- #define N 6
- int i=0,j=0,m=0,T[6];
- sem_t vide,plein,mutex; //Déclaration de sémaphores
- void *prod (void *arg)
- {
- printf("les nmbres cases vides est : %d\n", N-i);
- sem_wait(&plein);
- sem_wait(&mutex);
- m++;
- printf("Je suis le producteur et je met le msg dans le tampo\n" );
- T[i]=m;
- i=(i+1)%N;
- sem_post(&mutex);
- sem_post(&vide);
- return NULL;
- }
- void *cons (void *arg)
- {
- sem_wait(&vide);
- sem_wait(&mutex);
- printf("Je suis le consommateur et je prend le msg dans le tampo\n" );
- m=T[j];
- j=(j+1)%N;
- sem_post(&mutex);
- sem_post(&plein);
- return NULL;
- }
- int main(int argc,char **argv)
- //int main (void)
- {
- pthread_t cons,prod;
- int nbrprod,nbrcons;
- int k;
- //initialisation des semaphores
- sem_init (&mutex, 0, 1);
- sem_init (&plein, 0, 0);
- sem_init (&vide, 0, N);
- printf ("Entrer le nombre de producteurs\n" );
- scanf ("%d", &nbrprod);
- printf ("Entrer le nombre de consommateurs\n" );
- scanf ("%d", &nbrcons);
- for(k=0;k<nbrprod;k++)
- {
- pthread_create(&prod,NULL,prod,NULL);
- }
- for(k=0;k<nbrcons;k++)
- {
- pthread_create(&cons,NULL,cons,NULL);
- }
- pthread_join (prod, NULL);
- pthread_join (cons, NULL);
- return 0;
- }
|
|