Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur problème du barbier

Sujet résolu
    23 octobre 2014 à 15:29:47

    Bonjour,

    je souhaite m'entrainer au mutex et sémaphore avec un problème bien connu, celui du barbier.

    J'ai donc récupéré le code sur internet (ici : http://www.linux-france.org/article/devl/barbier/barbier.html), pour en voir le fonctionnement .

    Mais malheureusement lorsque je compile chez moi, j'ai un problème lors de la compilation.

    Donc soit je compile mal soit il y a un problème dans le code.

    Voici le code.

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <semaphore.h>
    
    /* Taille de la salle d'attente */
    #define NB_PLACES 8
    
    /* Lock pour le porte monnaie */
    pthread_mutexattr_t mutex_attr;
    pthread_mutex_t money_lock;
    
    /* Les quatres semaphores */
    sem_t places;
    sem_t salle_vide;
    sem_t piece;
    sem_t dehors;
    
    /* Caisse du barbier */
    int porte_monnaie=0;
    
    void proc_barbier(void *ptr);
    void proc_client(void *ptr);
    
    void main(void)
    {
    /* Thread du barbier */
    pthread_t barbier;
    /* Ptr sur thread pour les clients */
    pthread_t *ptr_sur_thread;
    
    /* Init des semaphores */
    sem_init(&places, 0, NB_PLACES);
    sem_init(&salle_vide, 0, 0);
    sem_init(&piece, 0, 0);
    sem_init(&dehors, 0, 0);
    
    /* Init du lock */
    pthread_mutex_init(&money_lock, &mutex_attr);
    
    /* On demarre le barbier */
    pthread_create(&barbier, NULL, (void*)&proc_barbier, NULL);
    
    /* Quand le user fait un retour de chariot, on lance un client */
    while(1)
    {
    getchar();
    printf("main: creation client.\n");
    ptr_sur_thread=(void*)malloc(sizeof(pthread_t));
    pthread_create((void*)&ptr_sur_thread, NULL, (void*)&proc_client, NULL);
    }
    
    /* Quand le barbier meurt, on exit */
    pthread_join(barbier, NULL);
    }
    
    void proc_barbier(void *ptr)
    {
    int i;
    printf("b: Ouverture du magazin.\n");
    while(1)
    {
    sem_getvalue(&salle_vide, &i);
    if(i==0)
    {
    pthread_mutex_lock(&money_lock);
    i=porte_monnaie;
    pthread_mutex_unlock(&money_lock);
    printf("b: je vais me coucher, journee a %i francs... pour l'instant.\n",i );
    }
    sem_wait(&salle_vide);
    sem_post(&piece);
    printf("b: je mousse un client.\n", i);
    sleep(2);
    printf("b: fini.\n");
    sem_post(&dehors);
    }
    }
    
    void proc_client(void *ptr)
    {
    int i;
    printf("c: J'arrive\n");
    sem_getvalue(&places, &i);
    printf("c: Il reste %i places de libre.\n", i);
    sem_wait(&places);
    printf("c: Je me pose sur une chaise (et je prend une BD).\n", i);
    sem_post(&salle_vide);
    sem_wait(&piece);
    sem_post(&places);
    printf("c: Je rentre dans la piece et me fait raser.\n");
    pthread_mutex_lock(&money_lock);
    porte_monnaie=porte_monnaie+10;
    pthread_mutex_unlock(&money_lock);
    sem_wait(&dehors);
    printf("c: Je rentre chez moi, apres avoir payer.\n");
    }

    Je vous serai reconnaissant si vous pouviez m'aider à le compiler sans erreur.

    Je compile en faisant : gcc -lpthread barbier.c

    Merci d'avance ;)

    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2014 à 20:21:55

      archieurekai a écrit:

      Mais malheureusement lorsque je compile chez moi, j'ai un problème lors de la compilation.

      Mais encore ? (C'est quoi le message d'erreur ?)
      • Partager sur Facebook
      • Partager sur Twitter
        23 octobre 2014 à 23:03:00

        Désolé, j'ai complétement oublié d'indiquer l'erreur.

        • Partager sur Facebook
        • Partager sur Twitter
          27 octobre 2014 à 18:57:50

          Lignes 73 et 87 tu utilises la variable "i" inutilement (ya rien à remplacer dans tes chaînes).

          C'est tout ce qu'il y a comme message d'erreur ?

          -
          Edité par Sisyphe 73-173 27 octobre 2014 à 18:58:16

          • Partager sur Facebook
          • Partager sur Twitter
            29 octobre 2014 à 15:38:59

            Sisyphe 73-173 a écrit:

            Lignes 73 et 87 tu utilises la variable "i" inutilement (ya rien à remplacer dans tes chaînes).

            C'est tout ce qu'il y a comme message d'erreur ?

            -
            Edité par Sisyphe 73-173 le 27 octobre 2014 à 18:58:16

            Désolé, j'ai oublié de le dire, mais j'ai finalement réussi à résoudre le problème. Il suffisait d'enlever la ligne 49.

            ptr_sur_thread=(void*)malloc(sizeof(pthread_t));




            • Partager sur Facebook
            • Partager sur Twitter

            erreur problème du barbier

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown