-
[C] Thread sous windows
Bonjour,
J'ai une application qui fait appel à une fonction qui dans certaines conditions me bloque tout. Pour éviter cela j'ai créé un thread qui appelle cette fameuse fonction. Donc mon appli n'est plus bloquée mais parfois la fonction en question buge et mon thread ne se termine jamais. Je n'ai pas le code la fonction qui pose problème et je suis obligé de m'en servir.
Ma question est donc de savoir comment tuer ce thread de l'extérieur. J'ai bien lu le support de Microsoft et le reste mais tous parlent de mécanisme de synchro. Or je ne peux pas m'en servir car mon thread se bloque à l'appel de cette fonction.
Si quelqu’un pouvait me donner des infos sur la manière de fermer un thread à partir d'un autre, ca m'aiderait vraiment.
Merci à vous tous et bonne soirée.
-
Il est possible d'utiliser TerminateThread mais cette méthode est très vivement déconseillée (voir la doc MSDN), en particulier :
- Si le thread détient une section critique, cette dernière n'est pas relachée donc on reste pendu :(
- Si le thread est en train d'allouer dans le tas (malloc ou new) le verrou de tas n'est pas relaché (le prochain malloc va bloquer l'application)
- Si certains appels à Kernel32 sont en cours lors du TerminateThread, l'état noyeau du process peut devenir inconsistant.
- Si le thread manipule l'état global d'une DLL, ce dernier peut être détruit, entrainant des conséquences pour les autres utilisateurs de la DLL.
De plus depuis Windows 2000 (également sous XP et 2K3) il y a une fuite mémoire quand on utilise cette fonction.
En clair : cette fonction ne peut être utilisée que quand on maîtrise le code du thread (" You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination").
Donc uniquement quand elle n'est pas utile (si je contrôle le code je peux y introduire une synchro et donc éviter cette fonction).