Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1372 connectés 

  FORUM HardWare.fr
  Programmation
  C

  segmentation fault sur producteur/consommateur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

segmentation fault sur producteur/consommateur

n°1519851
raks
Posté le 26-02-2007 à 10:19:57  profilanswer
 

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

mood
Publicité
Posté le 26-02-2007 à 10:19:57  profilanswer
 

n°1519913
Taz
bisounours-codeur
Posté le 26-02-2007 à 10:58:52  profilanswer
 

#
 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 ...

n°1519936
raks
Posté le 26-02-2007 à 11:10:50  profilanswer
 

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

n°1519973
Taz
bisounours-codeur
Posté le 26-02-2007 à 11:40:19  profilanswer
 

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

n°1520060
raks
Posté le 26-02-2007 à 13:10:17  profilanswer
 

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?

n°1520114
Taz
bisounours-codeur
Posté le 26-02-2007 à 14:25:24  profilanswer
 

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

n°1520469
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-02-2007 à 19:15:11  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  segmentation fault sur producteur/consommateur

 

Sujets relatifs
Axis Fault exceptionSegmentation Fault
Ou est l'erreur de segmentation ?Erreur de Segmentation
[SDL]seg fault à la fermeture en mode consolegcc : segm fault avec OPTIMISATIONS -O, 1 ou 2
Segmentation Fault : utilisation de StrCmp(GetEnv(), ...segmentation fault
Plus de sujets relatifs à : segmentation fault sur producteur/consommateur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR