Emmanuel Delahaye C is a sharp tool | 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 :
- #include <stdio.h>
- #include <string.h>
- #include <pthread.h>
- #include <semaphore.h>
- #ifdef WIN32
- #else
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #endif
- #define MAX 10
- int nb = 0, buffer[10], cpt1 = 0, cpt2 = 0; //un nombre qui sera la ressource commune
- //Déclaration de sémaphores
- sem_t a; //EM entre producteurs ou consommateurs
- sem_t b; //attente de producteur par le consommateur
- sem_t c; //attente des producteurs en cas de buffer plein
- void *prod (void *d)
- {
- sem_wait (&c);
- sem_wait (&a);
- printf ("Je suis le producteur et je modifie la ressource commune\n" );
- nb++; //modification de la ressource commune
- printf
- ("Je suis le producteur et je met la ressource commune dans le buffer\n" );
- buffer[cpt1] = nb;
- cpt1++;
- if (cpt1 == MAX)
- {
- cpt1 = 0;
- }
- sem_post (&a);
- sem_post (&b);
- /* -ed- parametre non utilise. C'est louche... */
- (void) d;
- /* -ed- un thread doit retourner une adresse ou NULL */
- return NULL;
- }
- void *cons (void *d)
- {
- sem_wait (&b);
- sem_wait (&a);
- printf
- ("Je suis le consommateur et je prend la ressource commune dans le buffer\n" );
- nb = buffer[cpt2];
- printf ("Je suis le consommateur et j'affiche le nombre qui est: %d\n",
- nb);
- cpt2++;
- if (cpt2 == MAX)
- {
- cpt2 = 0;
- }
- sem_post (&a);
- sem_post (&c);
- (void) d;
- return NULL;
- }
- /* -ed- manque void */
- int main (void)
- {
- pthread_t produ, conso;
- /* -ed- etait de type pthread_t... */
- int nbprod, nbconso;
- int rc, t;
- //initialisation des semaphores
- sem_init (&a, 0, 1);
- sem_init (&b, 0, 0);
- sem_init (&c, 0, MAX);
- for (t = 0; t < 10; t++)
- {
- buffer[t] = 0;
- }
- printf ("Entrer le nombre de producteurs\n" );
- /* -ed-
- scanf("%d", nbprod);
-
- scanf() avec "%d" attend l'adrese d'un int */
- scanf ("%d", &nbprod);
- printf ("Entrer le nombre de consommateurs\n" );
- scanf ("%d", &nbconso);
- for (t = 0; t < nbprod; t++)
- {
- rc = pthread_create (&produ, NULL, prod, 0);
- if (rc)
- {
- printf ("ERROR; return code from pthread_join() is %d\n", rc);
- }
- }
- for (t = 0; t < nbconso; t++)
- {
- rc = pthread_create (&conso, NULL, cons, 0);
- if (rc)
- {
- printf ("ERROR; return code from pthread_join() is %d\n", rc);
- }
- }
- pthread_join (produ, 0);
- pthread_join (conso, 0);
- /* -ed- main() retourne une valeur au système. 0 est correct (OK) */
- return 0;
- }
|
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/
|