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

C Discussion :

Soucis d'affectation pour arguments de threads


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Par défaut Soucis d'affectation pour arguments de threads
    Bonjour à tous,

    Je me décide à vous exposer mon problème après avoir abandonné toutes résolutions.

    L'objectif de mon bout de code est de faire un "conteneur" qui va contenir des pointeurs de plusieurs objets afin de passer le conteneur en argument d'une thread (pour éviter de faire des variables globales monstrueuses).

    La thread doit mettre à jour les deux structures en parrallèle du programme principale, ou d'autres threads travaillent sur le même objet (en vérité A est une structure de stockage d'info partagé par plusieurs thread et B est un socket TCP qui reçoit des ordres de mise à jour)

    Malheureusement, les lignes :

    conteneur->bar = &temp;
    conteneur->bar2 = temp2;

    me sortent une erreur de bus, j'ai tenté de débuguer avec gdb mais je ne parvient pas à trouver l'erreur.

    Si une âme charitable passe par ici...

    Merci d'avance.

    Trivol

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    #include <unistd.h>
     
    typedef struct A{
     
    	long foo1;
    	long foo2;
    }A;
     
    typedef struct B{
     
    	long **foo;
    }B;
     
    typedef struct C{
     
    	A *bar;
    	B *bar2;
    	long bar3;
    }C;
     
    void *threadBidon(void *lpParam){	
     
    	A *recup1 = (A*)lpParam->bar;
    	B *recup2 = (B*)lpParam->bar2;
    	long recup3 = (long)lpParam->bar3;
     
    	/*
     
    	Actions diverses sur ce qu'on a récupéré
     
    	*/
     
    	return (void *)NULL;
    }
     
     
    int main(){
     
    	A temp;
    	B *temp2;
    	C *conteneur;
     
    	pthread_t thid;
     
    	conteneur->bar = &temp;
    	conteneur->bar2 = temp2;
    	// conteneur->bar3 = 1;
     
    	pthread_create(&thid, NULL, threadBidon, (void *)conteneur);
     
    	return(0);
     
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(){
     
    	A temp;
    	B *temp2;
    	C *conteneur;
     	pthread_t thid;
     
    	conteneur->bar = &temp;
    	conteneur->bar2 = temp2;
    	// conteneur->bar3 = 1;
    1- conteneur est un pointeur sur structure C, mais la structure C n'a pas été créée. conteneur est non initialisé
    2- idem (sur structure B) pour temp2.
    On s'attend plutôt à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(void){
    	A temp;
    	B temp2;
    	C conteneur;
     	pthread_t thid;
     	conteneur.bar = &temp;
    	conteneur.bar2 = &temp2;
            conteneur.bar3 = 1;
    	pthread_create(&thid, NULL, threadBidon, &conteneur);
    	return(0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void *threadBidon(void *lpParam){		
    	A *recup1 = (A*)lpParam->bar;
    	B *recup2 = (B*)lpParam->bar2;
    	long recup3 = (long)lpParam->bar3;	
    	/*	
    	Actions diverses sur ce qu'on a récupéré
    	*/	
    	return (void *)NULL;
    }
    Les transtypages sont erronés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	A *recup1  =  ((C*)lpParam)->bar;
    	B *recup2  =  ((C*)lpParam)->bar2;
    	long recup3 = ((C*)lpParam)->bar3;
    	/*	
    	Actions diverses sur ce qu'on a récupéré
    	*/	
    	return NULL;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Trivol Voir le message
    L'objectif de mon bout de code est de faire un "conteneur" qui va contenir des pointeurs de plusieurs objets afin de passer le conteneur en argument d'une thread (pour éviter de faire des variables globales monstrueuses).
    Il y a beaucoup d'erreurs graves et basiques dans ton code. Avant de te lancer dans les threads, il faut apprendre les bases du C, et notamment 2 choses importantes :
    1. On utilise jamais une variable qui n'a pas été initialisée
    2. On utilise pas le transtypage ([type]cast) sauf dans des cas rares, répertoriés ou documentés.

    Le principe du paramètre générique est de passer une adresse anonyme, qui est récupérée telle quelle dans le thread et qui sert à initialiser un pointeur local typé.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
     
    typedef struct A
    {
       long foo1;
       long foo2;
    }
    A;
     
    typedef struct B
    {
       long **foo;
    }
    B;
     
    typedef struct C
    {
       A *bar;
       B *bar2;
       long bar3;
    }
    C;
     
    void *threadBidon (void *lpParam)
    {
       C *p_user = lpParam;
       A *recup1 = p_user->bar;
       B *recup2 = p_user->bar2;
       long recup3 = p_user->bar3;
     
       /*
          Actions diverses sur ce qu'on a récupéré
        */
     
       return NULL;
    }
     
    int main (void)
    {
     
       A temp = { 1, 2 };
       B temp2 = { NULL };
       C conteneur;
     
       pthread_t thid;
     
       conteneur.bar = &temp;
       conteneur.bar2 = &temp2;
       conteneur.bar3 = 1;
     
       pthread_create (&thid, NULL, threadBidon, &conteneur);
     
       return 0;
    }

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Par défaut
    Merci beaucoup de votre aide. Effectivement, une erreur basique qui parait évidente avec la correction.

    Il y a beaucoup d'erreurs graves et basiques dans ton code. Avant de te lancer dans les threads, il faut apprendre les bases du C, et notamment 2 choses importantes :
    100 % d'accord, malheureusement on nous oblige à faire un projet (assez intéressant cela dit) qui mélange thread, TCP et une histoire de partage de mémoire en SHM + un analyseur en Lex&Yacc.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Trivol Voir le message
    <...>on nous oblige à faire un projet (assez intéressant cela dit) qui mélange thread, TCP et une histoire de partage de mémoire en SHM + un analyseur en Lex&Yacc.
    Peu importe. Si tu ne connais pas les bases du C, tu n'iras pas loin sur un tel projet...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. souci pour lancer des Thread simultanément
    Par Tyrael62 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 18/08/2008, 14h21
  2. Création d'une Prodédure ayant pour arguments les contrôles Data
    Par Blunet dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/06/2006, 10h55
  3. passer un tableau d'arguments à un thread
    Par madimane dans le forum POSIX
    Réponses: 5
    Dernier message: 14/04/2006, 07h08
  4. Réponses: 1
    Dernier message: 08/03/2006, 20h06
  5. [MFC] Envoyez un argument au thread
    Par Oberown dans le forum MFC
    Réponses: 3
    Dernier message: 23/08/2004, 16h59

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