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 :

Détruire correctement un pthread?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut Détruire correctement un pthread?
    Bonjour,

    Je rencontre un petit soucis avec un programme : en gros, il s'agit d'un serveur qui lance un certain nombre de threads pour gérer plusieurs clients à la fois, puis de nouveau plusieurs threads qui se partagent le calcul d'une image. L'image est recalculée toutes les 500ms tant que le client est connecté.

    J'utilise à la fin des fonctions pthread_exit(), et j'ai mis un pthread_detach() après chaque pthread_create(), j'avais cru comprendre que ça permettait de faire en sorte que tous les threads quittent correctement (ou alors j'ai rien compris au cours).

    Pourtant pstree me renvoie ce genre de chose :
    bash───main.ex───85*[{main.ex}]

    Et la valeur ne cesse d'augmenter, tout comme la mémoire utilisée.

    Une idée sur la manière dont on peut faire pour supprimer proprement ces threads à la fin de chaque calcul?



    Edit : Mauvaise utilisation d'une variable pthread_t, cf. mon deuxième message, merci d'avoir répondu!

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Blabla Pthreads

    D'après ce document, le join/detach sert uniquement à définir si tes threads doivent attendre ou pas la fin d'un autre threads.
    Donc ça n'est pas très utile le detach si tu n'as pas un réel besoin de synchronisation.

    Par contre, hormis le pthread_exit... je ne vois pas grand chose d'autre...
    Ah si : il ne fait aucun free ni close ! (ce qui expliquerait s'il y a des fuites mémoires...)

    Tu peux essayer d'ajouter des tas de pthread_join pour vérifier à quel moment ils se finissent (si tu en doutes).
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut
    Bon, effectivement les fuites de mémoires j'ai vérifié, j'ai des mallocs() sans free() qui traînent dans mon code.

    Sinon après quelques tests, il semble que le problème soit uniquement au niveau des threads de calcul, ceux qui gèrent les clients quittent correctement.


    Edit : Oups, semblerait que j'ai bêtement réutilisé plusieurs fois le même pthread_t comme paramètre de pthread_create() différents (comme je crée mes threads dans une boucle), j'ai juste rectifié ça, on dirait que c'est bon, ce problème est a priori réglé.

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Euh... je me suis emmêlé les pinceaux dans l'explication : le join n'est pas utile si tu n'as pas besoin de synchro.

    Avec ton join, essayes de voir quel thread se finit quand !

    EDIT : En effet, ça risque de faire des étincelles avec le même id !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Étonnamment j'avais lu un sujet dans lequel quelqu'un faisait la remarque que quitter un thread avec un return serait plus propre qu'avec un pthread_exit. Si je retrouve le sujet je mettrai le lien.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 59
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Euh... je me suis emmêlé les pinceaux dans l'explication : le join n'est pas utile si tu n'as pas besoin de synchro.

    Avec ton join, essayes de voir quel thread se finit quand !

    EDIT : En effet, ça risque de faire des étincelles avec le même id !
    Petite rectification.

    Le pthread_join est indispensable à faire, même si on n'a pas besoin de synchro, sur un thread créé en mode PTHREAD_CREATE_JOINABLE qui est le mode par défaut.

    Si le join n'est pas fait, la ressource n'est pas libérée au niveau système, et on peut atteindre assez vite la limite max du nombre de thread sur le système ( même si ceux-ci ne tournent plus ).

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

Discussions similaires

  1. Détruire correctement une instance
    Par Immobilis dans le forum C#
    Réponses: 8
    Dernier message: 20/06/2008, 17h46
  2. Faites des messages corrects !!!
    Par Alacazam dans le forum C++
    Réponses: 6
    Dernier message: 23/03/2006, 15h56
  3. Un Sender peut-il s'auto-détruire lors d'un onClick?
    Par Flo. dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/07/2002, 10h31

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