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 :

Pthread terminés restent en mémoire, conduisant à une Seg Fault


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Pthread terminés restent en mémoire, conduisant à une Seg Fault
    Bonjour,

    Je développe actuellement une application en C++, tournant sur une carte SBC9261, sous Linux 2.6.24.

    Cette application est chargée de communiquer sur le bus CAN (bus de terrain très utilisé dans l'automobile) avec d'autres systèmes.

    Pour cela, j'ai mis en place dans mon programme deux phtreads : l'un s'occupe de "lire" les messages arrivant sur le CAN. Si un message est lu, il lance un second pthread qui lui va s'occuper de traiter la trame CAN reçue. Ainsi, il est possible de traiter une trame tout en en réceptionnant une autre, ce qui peut-être nécessaire lorsque le traitement d'une trame demande d'autres informations sur le bus CAN.

    Voici le code (simplifié) de la routine du premier thread (la réception) :

    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
    void *canRead(void *arg) {
     
        struct can_frame frameRecv;
        unsigned int i;
        pthread_attr_t attr;
        pthread_t threadHandler;
     
        // P. thread attribute
        pthread_attr_init(&attr);
        pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
     
        while(1) {
     
            // Init frame
            memset(&frameRecv, 0, sizeof(struct can_frame));
     
            // Read from CAN
            read(canDevice, &frameRecv, sizeof(struct can_frame));
     
            // Threading to be able to receive while handling requests
            // pthread_create() prototype : int pthread_create(pthread *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg_of_routine);
    	if (pthread_create(&threadHandler, &attr, canHandler, &frameRecv)) {
                perror("pthread_create");
                exit(-1);
            }
     
            // Sleep for a while
            usleep(50*1000);
        }
    }
    canHandler est la routine qui s'occupe du traitement de la trame. Elle ne contient pas de boucle infinie et s'exécute en 3 secondes, dans le pire des cas.

    Tout ceci fonctionne sans problème, du moins les 15 premières minutes. Un problème survient ensuite :

    Les threads canHandler semblent rester en mémoire après leur exécution, car la mémoire système décroît jusqu'à entraîner une Segmentation Fault.

    Si je retire le pthread_create(), l'appli peut tourner indéfiniment sans dépasser les 17% d'occupation mémoire.

    Le manuel de pthread_create() donne un exemple qui traite de la mémoire.

    En gros, ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void *res;
     
    /*Création de threads ici...*/
     
    pthread_join(<un_thread>, &res);
     
    free(res);      /* Free memory allocated by thread */
    N'ayant pas à exécuter de pthread_join(), comment pourrais-je initialiser le pointeur res ou utiliser la fonction free(), pour stopper ces fuites de mémoires ?

    Toutes autres suggestions sont les bienvenues !

    Merci pour votre aide !

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Si tu ne veux pas faire de pthread_join(), il faut que tu créé un thread "détaché" en utilisant pthread_attr_setdetachstate().

    La totalité des ressources d'un "joinable thread" (c'est le cas par défaut) n'est libérées que sur le pthread_join(). La totalité des ressources d'un "detached thread" est libérée automatiquement dès que le thread termine.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Wow ! Grand merci, ça fonctionne !
    Moi qui m'attendais à passer encore quelques jours là-dessus !

    Encore merci, joyeuses fêtes !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/03/2006, 18h24
  2. Réponses: 11
    Dernier message: 13/01/2006, 15h30
  3. [.NET][C#] mise en mémoire d'une classe
    Par AB- dans le forum C#
    Réponses: 5
    Dernier message: 10/11/2005, 17h11
  4. Utilisation Mémoire d'une application
    Par scorplex dans le forum Composants VCL
    Réponses: 8
    Dernier message: 21/05/2005, 03h01
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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