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

POSIX C Discussion :

Probleme passage argument thread


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Probleme passage argument thread
    Bonjour,

    Je suis débutant dans la création de thread et j'ai pu comprendre qu'on ne pouvais passer qu'un seul argument dans la fonction pthread_create().

    Par conséquent j'ai créer une structure avec toutes mes variables a faire passer.

    Voici un extrait de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct thread
    {
    espece ** mer;
    SDL_Surface * images[20];
    humain * pecheur;
    } donnee_t ;
    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
     
    int start()
      {
      int i;
      int j;
     
      pthread_t th_eco;
      pthread_t th_affichage;
     
      abscisse_sortie=TAILLE_MER-1;
     
      SDL_Surface * images[20];
      init_images(images);
     
      espece** mer;
      humain* pecheur;
     
      srand(time(NULL));
     
      mer=(espece**)malloc(TAILLE_MER*sizeof(espece*));
     
      for(j=0;j<TAILLE_MER;j++)
        {
        mer[j]=(espece*)malloc(TAILLE_MER*sizeof(espece));
        }
     
      donnee_t transfert;
     
      transfert.mer=(espece**)malloc(TAILLE_MER*sizeof(espece*));
     
      for(j=0;j<TAILLE_MER;j++)
        {
        transfert.mer[j]=(espece*)malloc(TAILLE_MER*sizeof(espece));
        }
      pecheur=malloc(sizeof(humain));
      transfert.pecheur=malloc(sizeof(humain));
     
      initialisation_mer(mer);
      initialisation_pecheur(pecheur);
     
     
     for(i=0;i<TAILLE_MER;i++)
       {
         for(j=0;j<TAILLE_MER;j++)
           {
    	 transfert.mer[i][j].type=mer[i][j].type;
                               .............
    	 transfert.mer[i][j].age=mer[i][j].age;
           }
       }
     
    (*transfert.pecheur).nom=(*pecheur).nom;
                    ....................
    (*transfert.pecheur).taille_sac_max=(*pecheur).taille_sac_max;
     
    for(j=0;j<20;j++)
      {
       transfert.images[j]=images[j];
      }
     
    pthread_create(&th_eco, NULL,(void *(*)())thread_eco, &transfert);
    pthread_create(&th_affichage, NULL,(void *(*)())thread_affichage, &transfert);
     
    pthread_join (th_eco, NULL);
    pthread_join (th_affichage, NULL);
     
    ...
      }
    Et voila mes deux threads :

    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
    void *thread_eco(donnee_t donnees)
      {
      int j,k;
     
      while(quit==0)
        {
        controle_population(donnees.mer);
        tour_courant++;
     
        for(j=0;j<TAILLE_MER;j++)
          {
          for(k=0;k<TAILLE_MER;k++)
            {
            if(donnees.mer[j][k].type!=TYPE_SOL && donnees.mer[j][k].type!=TYPE_PONT)
              {
              donnees.mer[j][k].age++;
              donnees.mer[j][k].satiete=tour(donnees.mer[j][k].satiete,donnees.mer[j][k].metabolisme);
     
              if(survie(donnees.mer[j][k].satiete,donnees.mer[j][k].dernier_repas,donnees.mer[j][k].duree_survie,donnees.mer[j][k].age,donnees.mer[j][k].esperance_vie)==1)
                {
                deplacement(donnees.mer,j,k);
                }
     
              else kill_poisson(donnees.mer,j,k);
              }
            }
          }
     
        remise_zero(donnees.mer);
        sleep(2);
        }
      return NULL;
      }
     
    void *thread_affichage(donnee_t donnees)
      {
      affichage(donnees.mer,donnees.pecheur,donnees.images);
      return NULL;
      }
    Le problème est que je tombe sur une série de Segmentation fault a cause de la fonction SDL_BlitSurface() ou bien lors de la manipulation de mon tableau donnees.mer...

    Donc je suppose que je ne sais pas passer mes paramètres dans mes threads.

    Pourriez-vous m'aider?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Leguerinos
    Bonjour,

    Je suis débutant dans la création de thread et j'ai pu comprendre qu'on ne pouvais passer qu'un seul argument dans la fonction pthread_create().

    Par conséquent j'ai créer une structure avec toutes mes variables a faire passer.

    Voici un extrait de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct thread
    {
    espece ** mer;
    SDL_Surface * images[20];
    humain * pecheur;
    } donnee_t ;
    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
     
    int start()
      {
      int i;
      int j;
     
      pthread_t th_eco;
      pthread_t th_affichage;
     
      abscisse_sortie=TAILLE_MER-1;
     
      SDL_Surface * images[20];
      init_images(images);
     
      espece** mer;
      humain* pecheur;
     
      srand(time(NULL));
     
      mer=(espece**)malloc(TAILLE_MER*sizeof(espece*));
     
      for(j=0;j<TAILLE_MER;j++)
        {
        mer[j]=(espece*)malloc(TAILLE_MER*sizeof(espece));
        }
     
      donnee_t transfert;
     
      transfert.mer=(espece**)malloc(TAILLE_MER*sizeof(espece*));
     
      for(j=0;j<TAILLE_MER;j++)
        {
        transfert.mer[j]=(espece*)malloc(TAILLE_MER*sizeof(espece));
        }
      pecheur=malloc(sizeof(humain));
      transfert.pecheur=malloc(sizeof(humain));
     
      initialisation_mer(mer);
      initialisation_pecheur(pecheur);
     
     
     for(i=0;i<TAILLE_MER;i++)
       {
         for(j=0;j<TAILLE_MER;j++)
           {
    	 transfert.mer[i][j].type=mer[i][j].type;
                               .............
    	 transfert.mer[i][j].age=mer[i][j].age;
           }
       }
     
    (*transfert.pecheur).nom=(*pecheur).nom;
                    ....................
    (*transfert.pecheur).taille_sac_max=(*pecheur).taille_sac_max;
     
    for(j=0;j<20;j++)
      {
       transfert.images[j]=images[j];
      }
     
    pthread_create(&th_eco, NULL,(void *(*)())thread_eco, &transfert);
    pthread_create(&th_affichage, NULL,(void *(*)())thread_affichage, &transfert);
     
    pthread_join (th_eco, NULL);
    pthread_join (th_affichage, NULL);
     
    ...
      }
    Et voila mes deux threads :

    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
    void *thread_eco(donnee_t donnees)
      {
      int j,k;
     
      while(quit==0)
        {
        controle_population(donnees.mer);
        tour_courant++;
     
        for(j=0;j<TAILLE_MER;j++)
          {
          for(k=0;k<TAILLE_MER;k++)
            {
            if(donnees.mer[j][k].type!=TYPE_SOL && donnees.mer[j][k].type!=TYPE_PONT)
              {
              donnees.mer[j][k].age++;
              donnees.mer[j][k].satiete=tour(donnees.mer[j][k].satiete,donnees.mer[j][k].metabolisme);
     
              if(survie(donnees.mer[j][k].satiete,donnees.mer[j][k].dernier_repas,donnees.mer[j][k].duree_survie,donnees.mer[j][k].age,donnees.mer[j][k].esperance_vie)==1)
                {
                deplacement(donnees.mer,j,k);
                }
     
              else kill_poisson(donnees.mer,j,k);
              }
            }
          }
     
        remise_zero(donnees.mer);
        sleep(2);
        }
      return NULL;
      }
     
    void *thread_affichage(donnee_t donnees)
      {
      affichage(donnees.mer,donnees.pecheur,donnees.images);
      return NULL;
      }
    Le problème est que je tombe sur une série de Segmentation fault a cause de la fonction SDL_BlitSurface() ou bien lors de la manipulation de mon tableau donnees.mer...

    Donc je suppose que je ne sais pas passer mes paramètres dans mes threads.

    Pourriez-vous m'aider?

    Merci d'avance


    Je n'ai pas regardé en détail tout le code. Mais rapidement, je vois un p'tit soucis à ce niveau :
    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
    int start()
    {
        [...]
        donnee_t transfert;
        [...]    
        pthread_create(&th_eco, NULL,(void *(*)())thread_eco, &transfert);
        pthread_create(&th_affichage, NULL,(void *(*)())thread_affichage, &transfert);
        [...]
    }
    
    void *thread_eco(donnee_t donnees)
    {
        [...]
    }
    
    void *thread_affichage(donnee_t donnees)
    {
        [...]
    }
    Les threads attendent plûtot un pointeur et non pas une structure.
    Et pour être cohérent avec la signature de pthread_create, il faudrait passer un pointeur générique.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Bien le bonjour,

    Je ne sais pas si ça va régler ton problème, mais il y a un souci dans ton code. En effet, tu crées une variable donnee_t transfert; dont tu passes l'adresse au thread.

    Une fois le thread lancé, la fonction start() se termine et la variable transfert est libérée, ton thread se retrouve donc avec l'adresse d'une variable libérée et tout accès à cette variable sera problématique.

    L'idée est soit de créer dynamiquement la variable de type donnee_t pour ne la libérer que dans le thread soit de dupliquer la donnee_t dans le thread pour ne plus être dépendant de l'instance présente dans la fonction start().

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Leguerinos
    Bonjour,

    Je suis débutant dans la création de thread et j'ai pu comprendre qu'on ne pouvais passer qu'un seul argument dans la fonction pthread_create().

    Par conséquent j'ai créer une structure avec toutes mes variables a faire passer.
    A lire d'urgence mais calmement plusieurs fois :

    http://emmanuel-delahaye.developpez....ds.htm#donnees

    tiré de

    http://emmanuel-delahaye.developpez.com/pthreads.htm
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. probleme passage d'argument
    Par xclam dans le forum Langage
    Réponses: 5
    Dernier message: 01/06/2007, 09h48
  2. Des problemes avec ces threads <pthread.h>
    Par nasamad dans le forum GTK+ avec C & C++
    Réponses: 26
    Dernier message: 07/07/2006, 12h46
  3. Probleme avec les threads
    Par Orahn dans le forum MFC
    Réponses: 5
    Dernier message: 04/11/2005, 10h14
  4. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25

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