IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Segmentation fault avec threads


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut Segmentation fault avec threads
    Bonjour à tous

    J'étais entraine d'implementer un programme qui gére le problème du carrefour en lagage c en utilisant les threads, mais il y a une erreur de segmantation; je peus pas la resoudre.

    voila mon code si qq de vous peut m'aider de detecter le defaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include<pthread.h>
    #include<stdio.h>
    #include<unistd.h>
    #include<time.h>
     
     
    static int Capteur1;
    static int Capteur2;
    static int Capteur3;
    static int Capteur4;
     
    char F1;
    char F2;
    char F3;
    char F4;
     
    static int voiture1;
    static int voiture2;
    static int voiture3;
    static int voiture4;
     
    pthread_t thread1;
    pthread_t thread2;
    pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
     
    int main()
    {
        voiture1 = voiture2 = voiture3 = voiture4 = 1;
     
        Capteur1=voiture1;
        Capteur2=voiture2;
        Capteur3=voiture3;
        Capteur4=voiture4;
     
        do
          {
    	if(Capteur1==1 || Capteur3==1)
    	  {Capteur1 = Capteur3 = 1;}
     
    	if(Capteur2==1 || Capteur4==1)
    	  {Capteur2 = Capteur4 = 1;}
     
    	pthread_create(&thread1,NULL,VOIE1(),NULL);
    	pthread_create(&thread2,NULL,VOIE2(),NULL);
     
    	if((Capteur1==1 || Capteur3==1) && (Capteur2==1 || Capteur4==1))
    	 {
    	pthread_mutex_lock(&mutex);
    	    F1=F3="R";
    	    printf("feu1 %c et feu3  %c  ",F1,F3);
    	    F2=F4="V";
    	    printf("feu2 %c et feu4 %c  ",F2,F4);
     
    	usleep(4000);
     
    	    F1=F3="V";
    	    printf("feu1 %c et feu3 %c  ",F1,F3);
    	    F4=F2="R";
    	    printf("feu2 %c et feu4 %c  ",F2,F4);
    	pthread_mutex_unlock(&mutex);
    	}
    	pthread_exit(NULL);
          }
      while(1);
      return(0);
      }
    void VOIE1()
        {
          if(Capteur1==1 || Capteur3==1)
    	{F1=F3="V";}
        }
     
    void VOIE2()
        {
        if(Capteur2==1 || Capteur4==1)
    	{F2=F4="V";}
        }
    et en tous cas merci d'avance, et je vous attend

  2. #2
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par aljekeny Voir le message
    Bonjour à tous

    J'étais entraine d'implementer un programme qui gére le problème du carrefour en lagage c en utilisant les threads, mais il y a une erreur de segmantation; je peus pas la resoudre.

    voila mon code si qq de vous peut m'aider de detecter le defaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include<pthread.h>
    #include<stdio.h>
    #include<unistd.h>
    #include<time.h>
     
     
    static int Capteur1;
    static int Capteur2;
    static int Capteur3;
    static int Capteur4;
     
    char F1;
    char F2;
    char F3;
    char F4;
     
    static int voiture1;
    static int voiture2;
    static int voiture3;
    static int voiture4;
     
    pthread_t thread1;
    pthread_t thread2;
    pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
     
    int main()
    {
        voiture1 = voiture2 = voiture3 = voiture4 = 1;
     
        Capteur1=voiture1;
        Capteur2=voiture2;
        Capteur3=voiture3;
        Capteur4=voiture4;
     
        do
          {
    	if(Capteur1==1 || Capteur3==1)
    	  {Capteur1 = Capteur3 = 1;}
     
    	if(Capteur2==1 || Capteur4==1)
    	  {Capteur2 = Capteur4 = 1;}
     
    	pthread_create(&thread1,NULL,VOIE1(),NULL);
    	pthread_create(&thread2,NULL,VOIE2(),NULL);
     
    	if((Capteur1==1 || Capteur3==1) && (Capteur2==1 || Capteur4==1))
    	 {
    	pthread_mutex_lock(&mutex);
    	    F1=F3="R";
    	    printf("feu1 %c et feu3  %c  ",F1,F3);
    	    F2=F4="V";
    	    printf("feu2 %c et feu4 %c  ",F2,F4);
     
    	usleep(4000);
     
    	    F1=F3="V";
    	    printf("feu1 %c et feu3 %c  ",F1,F3);
    	    F4=F2="R";
    	    printf("feu2 %c et feu4 %c  ",F2,F4);
    	pthread_mutex_unlock(&mutex);
    	}
    	pthread_exit(NULL);
          }
      while(1);
      return(0);
      }
    void VOIE1()
        {
          if(Capteur1==1 || Capteur3==1)
    	{F1=F3="V";}
        }
     
    void VOIE2()
        {
        if(Capteur2==1 || Capteur4==1)
    	{F2=F4="V";}
        }
    et en tous cas merci d'avance, et je vous attend
    C'est où l'erreur de segmentation

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <pthread.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <time.h>
     
    static int Capteur1 = 1;
    static int Capteur2 = 1;
    static int Capteur3 = 1;
    static int Capteur4 = 1;
     
    static char F1;
    static char F2;
    static char F3;
    static char F4;
     
    static void * VOIE1(void * dummy)
    {
       if(Capteur1 == 1  ||  Capteur3 == 1)
       {
          F1 = F3 = 'V';
       }
     
       return NULL;
    }
     
    static void * VOIE2(void * dummy)
    {
       if(Capteur2 == 1  ||  Capteur4 == 1)
       {
          F2 = F4 = 'V';
       }
     
       return NULL;
    }
     
    int main(void)
    {
       pthread_t       thread1;
       pthread_t       thread2;
       pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
     
       if(Capteur1 == 1  ||  Capteur3 == 1)
       {
          Capteur1 = Capteur3 = 1;
       }
     
       if(Capteur2 == 1  ||  Capteur4 == 1)
       {
          Capteur2 = Capteur4 = 1;
       }
     
       pthread_create(&thread1, NULL, VOIE1, NULL);
       pthread_create(&thread2, NULL, VOIE2, NULL);
     
       if((Capteur1 == 1  ||  Capteur3 == 1) && (Capteur2 == 1  ||  Capteur4 == 1))
       {
          pthread_mutex_lock(&mutex);
          F1 = F3 = 'R';
          printf("feu1 %c et feu3  %c  ", F1, F3);
          fflush(stdout);
          F2 = F4 = 'V';
          printf("feu2 %c et feu4 %c  ", F2, F4);
          fflush(stdout);
     
          usleep(4000);
     
          F1 = F3 = 'V';
          printf("feu1 %c et feu3 %c  ", F1, F3);
          fflush(stdout);
          F4 = F2 = 'R';
          printf("feu2 %c et feu4 %c  ", F2, F4);
          fflush(stdout);
          pthread_mutex_unlock(&mutex);
       }
     
       pthread_exit(NULL);
     
       return 0;
    }

  4. #4
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut
    je m'excuse pour le retard ..

    concernant l'erreur, quand je compiles avec gcc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -o Carrefour -g -D_REENTRANT Carrefour.c -lpthread
    le systeme envoie une liste des warnings:

    Carrefour.c: In function ‘main’:
    Carrefour.c:43: warning: implicit declaration of function ‘VOIE1’
    Carrefour.c:43: warning: passing argument 3 of ‘pthread_create’ makes pointer from integer without a cast
    Carrefour.c:44: warning: implicit declaration of function ‘VOIE2’
    Carrefour.c:44: warning: passing argument 3 of ‘pthread_create’ makes pointer from integer without a cast
    Carrefour.c:49: warning: assignment makes integer from pointer without a cast
    Carrefour.c:51: warning: implicit declaration of function ‘pthread_yield’
    Carrefour.c:52: warning: assignment makes integer from pointer without a cast
    Carrefour.c:58: warning: assignment makes integer from pointer without a cast
    Carrefour.c:61: warning: assignment makes integer from pointer without a cast
    Carrefour.c: At top level:
    Carrefour.c:71: warning: conflicting types for ‘VOIE1’
    Carrefour.c:43: warning: previous implicit declaration of ‘VOIE1’ was here
    Carrefour.c: In function ‘VOIE1’:
    Carrefour.c:74: warning: assignment makes integer from pointer without a cast
    Carrefour.c: At top level:
    Carrefour.c:77: warning: conflicting types for ‘VOIE2’
    Carrefour.c:44: warning: previous implicit declaration of ‘VOIE2’ was here
    Carrefour.c: In function ‘VOIE2’:
    Carrefour.c:80: warning: assignment makes integer from pointer without a cast
    mais q meme, j'ai executé le programme puisque il n'y a que des warnings, et en ce moment là je reçois l'erreur suivante:

    Segmentation fault
    et merci pour nicolas.sitbon

Discussions similaires

  1. Segmentation fault avec strcmp
    Par FenX. dans le forum Débuter
    Réponses: 6
    Dernier message: 10/08/2007, 08h14
  2. segmentation fault avec wxGLCanvas
    Par Ardeciel dans le forum wxWidgets
    Réponses: 1
    Dernier message: 20/03/2007, 20h13
  3. Probleme de segmentation fault avec sprintf
    Par MathG dans le forum C++
    Réponses: 5
    Dernier message: 14/12/2006, 01h12
  4. Segmentation fault avec glCompressedTexImage2DARB
    Par patbier dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/12/2005, 10h32
  5. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo