Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4761 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Threads posix

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Threads posix

n°2070696
ikseg
Qui vivra verra!
Posté le 18-04-2011 à 16:50:17  profilanswer
 

Bonjour,
Je crée 12 threads posix avec la fonction pthread_create.
Il y a 10 threads qui son censés se terminer, donc lorsque je fais un pthread_join à la fin du programme, le statut est bien à finish.
2 threads tournent en boucle, je dois les arrêrter avec pthread_cancel.
Le problème, c'est que lorsque j'applle pthread_cancel, il y a des allocations en plus (que je vois avec valgrind) qui ne sont pas libérées.
 
Comment remédier à ce problème??
 
Merci d'avance!

mood
Publicité
Posté le 18-04-2011 à 16:50:17  profilanswer
 

n°2070699
xilebo
noone
Posté le 18-04-2011 à 17:02:29  profilanswer
 

il me semble qu'un thread créé en non-détaché doit obligatoirement être libéré par un pthread_join.
 
Lorsque tu veux terminer un thread de façon synchrone, c'est assez facile en passant par une variable de controle + pthread_join.  
 
Par contre lorsque tu ne sais pas quand se termine le thread, c'est plus difficile de faire le join dessus (je n'ai pas trouvé de méthode idéale pour libérer les ressources ).

n°2070744
ikseg
Qui vivra verra!
Posté le 18-04-2011 à 19:05:23  profilanswer
 

Je fais un pthread_join pour les deux threads (après le pthread_cancel). Ce qui me fait 17 allocs pour 12 free. Si je mets pas le pthread_cancel, ca me fait 12 allocs pour 12 frees! Le problème si je fais ca,  c'est que je dois attendre que les deux threads se terminent, ce qui parfois prend plusieurs minutes !

n°2070753
xilebo
noone
Posté le 18-04-2011 à 20:13:49  profilanswer
 

le pthread_cancel interrompt et termine directement la fonction de thread là où elle en était. Donc si tu avais des désallocations à faire à la terminaison de ton thread, elles ne seront pas faites.
 

n°2070758
ikseg
Qui vivra verra!
Posté le 18-04-2011 à 20:39:15  profilanswer
 

Et on peut pas remédier à ça?
Je supprime tous les sémaphores que j'ai initialisé avant de faire le cancel et ça me met toujours 15 allocs, 10 frees :/

n°2070759
xilebo
noone
Posté le 18-04-2011 à 20:48:46  profilanswer
 

un exemple.
 
Si tu fais ça :
 

Code :
  1. void * thread_cb( void * _param)
  2. {
  3. char *buf = malloc( TAILLE_BUFFER );
  4. while ( traitement )
  5. {
  6. // traitement
  7. }
  8. free (buf);
  9. return NULL;
  10. }


 
Si tu fais un pthread_cancel sur le thread dont la fonction est thread_cb, le malloc ne sera pas libéré car le code ne passera pas par le free.  
 
Le mieux est que tu postes ton code ou une partie pour qu'on puisse identifier les ressources non désallouées.

n°2070779
h3bus
Troll Inside
Posté le 19-04-2011 à 00:23:34  profilanswer
 

Tu peux:
- allouer tes ressources dans ton thread appelant
ou
- utiliser un sémaphore qui dès qu'il est reçu par ton thread fils déclenche le nettoyage des ressources allouées et quitte le thread

 

La première méthode est efficace si tu est capable de prédire les ressources utilisées par ton thread et de les lui transmettre au facilement.

 

La deuxième méthode est la plus souple mais aussi plus complexe à programmer, un pooling sur le sémaphore devant être effectué fréquemment si tu veux de la réactivité.


Message édité par h3bus le 19-04-2011 à 00:24:14

---------------
sheep++

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Threads posix

 

Sujets relatifs
Sockets et Threads sont sur un bateauutilisation des threads
threads en chat sur PythonThreads synchronisés ?
[C#] threads et communicationMFC & Threads problème de compréhension
[java] Petite question sur les threads[Pascal / SDL] Problème pour gérer les Threads
Threads Posix et verrousfreebsd et les threads posix
Plus de sujets relatifs à : Threads posix


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)