segmentation fault sur producteur/consommateur

segmentation fault sur producteur/consommateur - C - Programmation

Marsh Posté le 26-02-2007 à 10:19:57    

Bonjour,
 
Je dois réaliser un programme illustrant le problème du producteur/consommateur en C.
 
Avec un seul producteur et consommateur, je ne rencontre aucun problème mais avec plusieurs, j'obtiens une segmentation fault.
 
Voici mon code:

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <semaphore.h>
  8. #include <pthread.h>
  9. #include <fcntl.h>
  10. #define MAX 10
  11. int nb=0, buffer[10], cpt1=0, cpt2=0; //un nombre qui sera la ressource commune
  12. //Déclaration de sémaphores
  13. sem_t a; //EM entre producteurs ou consommateurs
  14. sem_t b; //attente de producteur par le consommateur
  15. sem_t c; //attente des producteurs en cas de buffer plein
  16. void *prod (void *d)
  17. {
  18.   sem_wait(&c);
  19.   sem_wait(&a);
  20.   printf("Je suis le producteur et je modifie la ressource commune\n" );
  21.   nb++; //modification de la ressource commune
  22.   printf("Je suis le producteur et je met la ressource commune dans le buffer\n" );
  23.   buffer[cpt1]=nb;
  24.   cpt1++;
  25.   if (cpt1 == MAX)
  26.   {
  27.     cpt1=0;
  28.   }
  29.   sem_post(&a);
  30.   sem_post(&b);
  31. }
  32. void *cons (void *d)
  33. {
  34.   sem_wait(&b);
  35.   sem_wait(&a);
  36.   printf("Je suis le consommateur et je prend la ressource commune dans le buffer\n" );
  37.   nb=buffer[cpt2];
  38.   printf("Je suis le consommateur et j'affiche le nombre qui est: %d\n", nb);
  39.   cpt2++;
  40.   if (cpt2 == MAX)
  41.   {
  42.     cpt2=0;
  43.   }
  44.   sem_post(&a);
  45.   sem_post(&c);
  46. }
  47. int main()
  48. {
  49.   pthread_t produ, conso, nbprod, nbconso;
  50.   int rc,t;
  51.   //initialisation des semaphores
  52.   sem_init(&a, 0, 1);
  53.   sem_init(&b, 0, 0);
  54.   sem_init(&c, 0, MAX);
  55.   for (t=0; t<10; t++)
  56.   {
  57.     buffer[t]=0;
  58.   }
  59.   printf("Entrer le nombre de producteurs\n" );
  60.   scanf("%d", nbprod);
  61.   printf("Entrer le nombre de consommateurs\n" );
  62.   scanf("%d", nbconso);
  63.   for (t=0; t<nbprod; t++)
  64.   {
  65.     rc = pthread_create(&produ, NULL, prod, 0);
  66.     if (rc)
  67.     {
  68.       printf("ERROR; return code from pthread_join() is %d\n", rc);
  69.     }
  70.   }
  71.   for (t=0; t<nbconso; t++)
  72.   {
  73.     rc = pthread_create(&conso, NULL, cons, 0);
  74.     if (rc)
  75.     {
  76.       printf("ERROR; return code from pthread_join() is %d\n", rc);
  77.     }
  78.   }
  79.   pthread_join(produ,0);
  80.   pthread_join(conso,0);
  81. }


 
Pouvez-vous m'aider svp?
 
Merci

Reply

Marsh Posté le 26-02-2007 à 10:19:57   

Reply

Marsh Posté le 26-02-2007 à 10:58:52    

#
 printf("Entrer le nombre de producteurs\n" );
#
 scanf("%d", nbprod);
#
 
#
 printf("Entrer le nombre de consommateurs\n" );
#
 scanf("%d", nbconso);
 
 
et on y croit très fort ...

Reply

Marsh Posté le 26-02-2007 à 11:10:50    

C'est vrai que un petit &, ça change tout!
 
Merci^^

Reply

Marsh Posté le 26-02-2007 à 11:40:19    

ça change rien. pthread_t n'est pas un int.

Reply

Marsh Posté le 26-02-2007 à 13:10:17    

Enfin, le principal, c'est que le programme fonctionne maintenant!
 
Mais il passe d'abord par tous les producteurs puis il fait tous les consommateurs, y aurait-il un moyen que ça se mélange un peu plus?

Reply

Marsh Posté le 26-02-2007 à 14:25:24    

ton programme ne fonctionne pas correctement avec ce mélange pthread/int. Corrige cela en premier. Et apprend à compiler avec des warnings.

Reply

Marsh Posté le 26-02-2007 à 19:15:11    

raks a écrit :

Je dois réaliser un programme illustrant le problème du producteur/consommateur en C.
 
Avec un seul producteur et consommateur, je ne rencontre aucun problème mais avec plusieurs, j'obtiens une segmentation fault.
 
Voici mon code:


Ton code ne compile pas. Corrections pour le rendre compilable :  

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <pthread.h>
  4. #include <semaphore.h>
  5. #ifdef WIN32
  6. #else
  7. #include <unistd.h>
  8. #include <stdlib.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <fcntl.h>
  12. #endif
  13. #define MAX 10
  14. int nb = 0, buffer[10], cpt1 = 0, cpt2 = 0; //un nombre qui sera la ressource commune
  15. //Déclaration de sémaphores
  16. sem_t a;                        //EM entre producteurs ou consommateurs
  17. sem_t b;                        //attente de producteur par le consommateur
  18. sem_t c;                        //attente des producteurs en cas de buffer plein
  19. void *prod (void *d)
  20. {
  21.    sem_wait (&c);
  22.    sem_wait (&a);
  23.    printf ("Je suis le producteur et je modifie la ressource commune\n" );
  24.    nb++;                        //modification de la ressource commune
  25.    printf
  26.       ("Je suis le producteur et je met la ressource commune dans le buffer\n" );
  27.    buffer[cpt1] = nb;
  28.    cpt1++;
  29.    if (cpt1 == MAX)
  30.    {
  31.       cpt1 = 0;
  32.    }
  33.    sem_post (&a);
  34.    sem_post (&b);
  35.    /* -ed- parametre non utilise. C'est louche... */
  36.    (void) d;
  37.    /* -ed- un thread doit retourner une adresse ou NULL */
  38.    return NULL;
  39. }
  40. void *cons (void *d)
  41. {
  42.    sem_wait (&b);
  43.    sem_wait (&a);
  44.    printf
  45.       ("Je suis le consommateur et je prend la ressource commune dans le buffer\n" );
  46.    nb = buffer[cpt2];
  47.    printf ("Je suis le consommateur et j'affiche le nombre qui est: %d\n",
  48.            nb);
  49.    cpt2++;
  50.    if (cpt2 == MAX)
  51.    {
  52.       cpt2 = 0;
  53.    }
  54.    sem_post (&a);
  55.    sem_post (&c);
  56.    (void) d;
  57.    return NULL;
  58. }
  59. /* -ed- manque void */
  60. int main (void)
  61. {
  62.    pthread_t produ, conso;
  63.    /* -ed- etait de type pthread_t... */
  64.    int nbprod, nbconso;
  65.    int rc, t;
  66.    //initialisation des semaphores
  67.    sem_init (&a, 0, 1);
  68.    sem_init (&b, 0, 0);
  69.    sem_init (&c, 0, MAX);
  70.    for (t = 0; t < 10; t++)
  71.    {
  72.       buffer[t] = 0;
  73.    }
  74.    printf ("Entrer le nombre de producteurs\n" );
  75.    /* -ed-
  76.       scanf("%d", nbprod);
  77.       scanf() avec "%d" attend l'adrese d'un int */
  78.    scanf ("%d", &nbprod);
  79.    printf ("Entrer le nombre de consommateurs\n" );
  80.    scanf ("%d", &nbconso);
  81.    for (t = 0; t < nbprod; t++)
  82.    {
  83.       rc = pthread_create (&produ, NULL, prod, 0);
  84.       if (rc)
  85.       {
  86.          printf ("ERROR; return code from pthread_join() is %d\n", rc);
  87.       }
  88.    }
  89.    for (t = 0; t < nbconso; t++)
  90.    {
  91.       rc = pthread_create (&conso, NULL, cons, 0);
  92.       if (rc)
  93.       {
  94.          printf ("ERROR; return code from pthread_join() is %d\n", rc);
  95.       }
  96.    }
  97.    pthread_join (produ, 0);
  98.    pthread_join (conso, 0);
  99.    /* -ed- main() retourne une valeur au système. 0 est correct (OK) */
  100.    return 0;
  101. }


Joli cas de blocage... (Win32)


Entrer le nombre de producteurs
2
Entrer le nombre de consommateurs
3
Je suis le producteur et je modifie la ressource commune
Je suis le producteur et je met la ressource commune dans le buffer
Je suis le producteur et je modifie la ressource commune
Je suis le producteur et je met la ressource commune dans le buffer
Je suis le consommateur et je prend la ressource commune dans le buffer
Je suis le consommateur et j'affiche le nombre qui est: 1
Je suis le consommateur et je prend la ressource commune dans le buffer
Je suis le consommateur et j'affiche le nombre qui est: 2


Je te conseille ceci :  
 
http://mapage.noos.fr/emdel/pthreads.htm


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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