probleme producteur consommateur

probleme producteur consommateur - C - Programmation

Marsh Posté le 31-12-2014 à 02:39:22    

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 :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<pthread.h>
  5. #include<semaphore.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #define N 6
  9. int i=0,j=0,m=0,T[6];
  10. sem_t vide,plein,mutex; //Déclaration de sémaphores
  11. void *prod (void *arg)
  12. {
  13. printf("les nmbres cases vides est : %d\n", N-i);
  14. sem_wait(&plein);
  15. sem_wait(&mutex);
  16. m++;                     
  17. printf("Je suis le producteur et je met le msg  dans le tampo\n" );     
  18. T[i]=m;
  19. i=(i+1)%N;
  20. sem_post(&mutex);
  21. sem_post(&vide);
  22. return NULL;
  23. }
  24. void *cons (void *arg)
  25. {
  26. sem_wait(&vide);
  27. sem_wait(&mutex);
  28. printf("Je suis le consommateur et je prend le msg dans le tampo\n" );
  29. m=T[j];
  30. j=(j+1)%N;
  31. sem_post(&mutex);
  32. sem_post(&plein);
  33. return NULL;
  34. }
  35. int main(int argc,char **argv)
  36. //int main (void)
  37. {
  38. pthread_t cons,prod;
  39. int nbrprod,nbrcons;
  40. int k;
  41. //initialisation des semaphores
  42. sem_init (&mutex, 0, 1);
  43. sem_init (&plein, 0, 0);
  44. sem_init (&vide, 0, N);
  45. printf ("Entrer le nombre de producteurs\n" );
  46. scanf ("%d", &nbrprod);
  47. printf ("Entrer le nombre de consommateurs\n" );
  48. scanf ("%d", &nbrcons);
  49. for(k=0;k<nbrprod;k++)
  50. {
  51. pthread_create(&prod,NULL,prod,NULL);
  52. }
  53. for(k=0;k<nbrcons;k++)
  54. {
  55. pthread_create(&cons,NULL,cons,NULL);
  56. }
  57. pthread_join (prod, NULL);
  58. pthread_join (cons, NULL);
  59. return 0;
  60. }

Reply

Marsh Posté le 31-12-2014 à 02:39:22   

Reply

Marsh Posté le 31-12-2014 à 09:05:46    

Bonjour,
 
Et sinon le problème que tu rencontre avec ton code?
Parce qu'on fait pas les exercices pour les autres ici.


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 31-12-2014 à 12:22:52    

On ne fait pas les exercices pour les autres, certes, mais on les aide quand ils ont manifestement bossé lesdits exercices, ce qui a l'air d'être le cas ici.
Il veut peut être juste savoir ce qu'on pense de son code.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-12-2014 à 15:58:14    

le code ça marche pas .....
voici le probleme ... aidez moi svp  
[img] http://im66.gulfup.com/CeTWwT.png[/img]

Reply

Marsh Posté le 31-12-2014 à 16:15:49    

Re,
 
Normal, le nom de tes méthodes et celle de tes threads sont les même.
 
Change le nom de tes méthodes et tu n'auras plus de problème.


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 31-12-2014 à 16:20:39    

comment !! je n'ai pas compris

Reply

Marsh Posté le 31-12-2014 à 16:37:49    

J'ai commenté les lignes changées
 

Code :
  1. #include<stdio.h>
  2.     #include<stdlib.h>
  3.     #include<unistd.h>
  4.     #include<pthread.h>
  5.     #include<semaphore.h>
  6.     #include <string.h>
  7.     #include <stdio.h>
  8.     #define N 6
  9.     int i=0,j=0,m=0,T[6];
  10.     sem_t vide,plein,mutex; //Déclaration de sémaphores
  11.     void *prod_meth (void *arg) //nom de function changé
  12.     {
  13.     printf("les nmbres cases vides est : %d\n", N-i);
  14.     sem_wait(&plein);
  15.     sem_wait(&mutex);
  16.     m++;                   
  17.     printf("Je suis le producteur et je met le msg  dans le tampo\n" );   
  18.     T[i]=m;
  19.     i=(i+1)%N;
  20.     sem_post(&mutex);
  21.     sem_post(&vide);
  22.     return NULL;
  23.     }
  24.     void *cons_meth (void *arg) //nom de function changé
  25.     {
  26.     sem_wait(&vide);
  27.     sem_wait(&mutex);
  28.     printf("Je suis le consommateur et je prend le msg dans le tampo\n" );
  29.     m=T[j];
  30.     j=(j+1)%N;
  31.     sem_post(&mutex);
  32.     sem_post(&plein);
  33.     return NULL;
  34.     }
  35.     int main(int argc,char **argv)
  36.     //int main (void)
  37.     {
  38.     pthread_t cons,prod;
  39.     int nbrprod,nbrcons;
  40.     int k;
  41.     //initialisation des semaphores
  42.     sem_init (&mutex, 0, 1);
  43.     sem_init (&plein, 0, 0);
  44.     sem_init (&vide, 0, N);
  45.     printf ("Entrer le nombre de producteurs\n" );
  46.     scanf ("%d", &nbrprod);
  47.     printf ("Entrer le nombre de consommateurs\n" );
  48.     scanf ("%d", &nbrcons);
  49.     for(k=0;k<nbrprod;k++)
  50.     {
  51.     pthread_create(&prod,NULL,prod_meth,NULL); //appel changé
  52.     }
  53.     for(k=0;k<nbrcons;k++)
  54.     {
  55.     pthread_create(&cons,NULL,cons_meth,NULL); //appel_changé
  56.     }
  57.     pthread_join (prod, NULL);
  58.     pthread_join (cons, NULL);
  59.     return 0;
  60.     }


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 31-12-2014 à 16:49:54    

change le nom comme je veux c tt ?

Reply

Marsh Posté le 31-12-2014 à 17:28:40    

Re,
 
Oui là c'est pour l'exemple.


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 31-12-2014 à 18:08:35    

ah ok mercii beaucoup cousin

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed