Threads posix

Threads posix - C - Programmation

Marsh Posté le 18-04-2011 à 16:50:17    

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!

Reply

Marsh Posté le 18-04-2011 à 16:50:17   

Reply

Marsh Posté le 18-04-2011 à 17:02:29    

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 ).

Reply

Marsh Posté le 18-04-2011 à 19:05:23    

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 !

Reply

Marsh Posté le 18-04-2011 à 20:13:49    

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.
 

Reply

Marsh Posté le 18-04-2011 à 20:39:15    

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 :/

Reply

Marsh Posté le 18-04-2011 à 20:48:46    

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.

Reply

Marsh Posté le 19-04-2011 à 00:23:34    

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++
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed