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 :

Problème : même nom de variable dans deux threads


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut Problème : même nom de variable dans deux threads
    Bonjour à tous,

    Un petit post pour un souci sur lequel je sèche complètement. Je dois simuler une application qui tourne à la base sur deux processeurs distincts. Cette simulation doit être faite en utilisant les threads : thread A pour le processeur 1, thread B pour le processeur 2. Il faut savoir que ces deux threads vont faire quasiment la même chose, l'un étant la sauvegarde de l'autre en cas de problème.
    Mon souci vient du fait qu'une des variables globales du threadA a le même nom qu'une du thread B, mais pas le même type (donc pas la même taille) et vu que la zone mémoire des threads est commune, j'ai des soucis de compilation. J'aurais voulu savoir comment contourner ce problème de la façon la plus propre possible, et en évitant de renommer ces deux variables sur l'ensemble de mon code.

    En gros, dans mon thread A, j'ai un "typeA toto;" et dans mon thread B, j'ai un "typeB toto;" et bien entendu je ne veux pas que cette variable soit partagée entre ces deux threads.

  2. #2
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    C'est bien pour ça qu'on préconise de ne jamais utiliser de variable globale

    Pourquoi tu ne définis pas directement tes variables dans tes 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
    void * threadA (void * toto) //thread envoie
    {
     
        ......
     
        return 0;
    }
     
    void * threadB (void * toto) //thread envoie
    {
     
        ......
     
        return 0;
    }
    Ainsi toto et toto n'ont rien à voir car définit en local.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    En théorie, un programme a deux threads ne consiste que en 1 programme. Donc 1 code source.
    Après, pour une raison d'organisation, on va faire en sorte d'avoir le code du threadA dans un fichier A.c et le code du threadB dans le fichier B.c
    Du coup, on en revient au simple problème de C, qui est: peut être avoir deux variables ayant le même nom.
    La réponse est Oui, mais c'est assez dangereux.
    Notamment, si on définit la variable a globale au fichier A.c et la variable globale au fichier B.c ça peut encore passé, mais y a beaucoup de cas ou le recouvrement posera des problèmes.

    Après le partage est encore un autre problème, mais ce n'est pas le votre, pour le moment

    (et je me suis fait grillé par royal380)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    (et je me suis fait grillé par royal380)
    ton éxplication est quand même plus teCHnique

    EDIT:
    Si je comprend bien :
    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
    void * envoie(void * p_data) //thread envoie
    {
        paramClient * toto = (paramClient*) p_data; 
        send(toto->socks,(char *)toto->PosClient,sizeof(toto->PosClient),0);
     
        return 0;
    }
     
    void * recevoir(void * p_data)  //thread de réception
    {
        paramClient * toto = (paramClient*) p_data; 
     
     
        recv(toto->socks,(char *)toto->PosServBalle,sizeof(toto->PosServBalle),0);
     
     
        return 0;
    }
    envoie et recevoir sont un seul programme ?
    Ou alors je comprend pas bien

    Je croyais que c'était 2 programmes bien distinct aux quels le processeur alloué du temps chacun leur tours.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par royal380 Voir le message
    EDIT:
    Si je comprend bien :
    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
    void * envoie(void * p_data) //thread envoie
    {
        paramClient * toto = (paramClient*) p_data; 
        send(toto->socks,(char *)toto->PosClient,sizeof(toto->PosClient),0);
     
        return 0;
    }
     
    void * recevoir(void * p_data)  //thread de réception
    {
        paramClient * toto = (paramClient*) p_data; 
     
     
        recv(toto->socks,(char *)toto->PosServBalle,sizeof(toto->PosServBalle),0);
     
     
        return 0;
    }
    envoie et recevoir sont un seul programme ?
    Ou alors je comprend pas bien

    Je croyais que c'était 2 programmes bien distinct aux quels le processeur alloué du temps chacun leur tours.
    Hum ...

    Tout d'abord, votre exemple de code fonctionne, car la visibilité de la variable 'paramClient' est limité au bloc (l'espace entre les accolades). Donc dans ce cas là, il n'y a aucun conflit. (Cela compile)
    Maintenant, pour revenir sur ce que j'ai dit. En fait, un programme qui contient des threads, et un programme unique (un seul executable, donc un seul code source). Tout programme démarre un thread (le thread principale, comme on aime bien l'appeler). Mais il peut toujours demarrer un second thread, qui partagera la mémoire, si je me rappelle bien, et qui partagera aussi le temps d'execution que la système laisse au programme). (Je confonds peut être avec les fork ... qui sont un peu différent sur le partage).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    En fait, je ne maitrise pas le contenu du code. Ce dernier est un système avionique complexe qui tourne de base sur deux processeurs distincts et que je dois simuler pour le faire tourner sur une machine mono-processeur, en utilisant donc les threads. Je subis donc un peu les idées pas forcément adapter que je dois mettre en place.
    Entre temps, j'ai vu qu'il existait la possibilité d'allouer une zone mémoire propre à chaque thread (la TSD ou TLS, voir http://fr.wikipedia.org/wiki/Thread_Local_Storage). Je tente d'utiliser ce mécanisme mais c'est pas très clair pour le moment. En effet, j'ai mes deux variables "typeA toto" et "typeB toto" que je dois déclarer explicitement pour pouvoir les utiliser en "extern" et je ne sais pas encore si l'utilisation de la TSD le permet (avec les fonction pthread_key_create, pthread_set/getspecific ...).
    Une petite question en passant : j'ai du mal à trouver de la doc sur l'utilisation du préfixe "__thread", est ce que quelqu'un sait quand on peut l'utiliser ?
    Merci d'avance

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    __thread (et le TLS en général), c'est pour une variable du même type partout qui est indépendante pour chaque thread.
    C'est ce qui est utilisé pour des fonctions comme strtok() et strerror() à la place des variables globales.

    Mais pour des variables de type différent et signification différente qui squattent le même nom, ça n'ira pas. C'est précisément pourquoi on recommande de limiter la portée des variables globales à un seul fichier source (mot-clé static).

    Si le code que tu ne maitrises pas est déjà compilé, il n'y a pas vraiment de solution. Sinon, tu peux séparer tes fichiers source un peu mieux et mettre un #define toto totoA / #define toto totoB dans les en-têtes ou en ligne de commande (généralement /Dtoto=totoA, mais ça doit dépendre du compilo).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/07/2010, 15h31
  2. problème de visibilité des variables dans un include
    Par d1g-2-d1g dans le forum Langage
    Réponses: 6
    Dernier message: 28/11/2005, 09h35
  3. [css]problème d'attribution de classe dans deux listes
    Par Mitaka dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 24/11/2005, 18h05
  4. [EasyPHP] problème de visibilité des variable dans les includes
    Par d1g-2-d1g dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 23/10/2005, 01h55
  5. Nom de variable dans une autre variable
    Par lsdInside dans le forum Linux
    Réponses: 5
    Dernier message: 04/12/2004, 19h36

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