Tuer un thread en cours d'exécution
Ce qui se passe si nous force à tuer un thread en cours d'exécution
J'ai un fil à savoir RecordThread()
qui appelle certaines complexe et fastidieuse fonctions. Dans ces fonctions, je suis en utilisant try-catch blocs, l'allocation et la désallocation de la mémoire et à l'aide de la section critique variables etc.
comme
void RecordThread()
{
AddRecord();
FindRecord();
DeleteRecord();
//...
ExitThread(0);
}
Après la création de ce thread, je suis immédiatement de le tuer avant de le thread termine son exécution. Dans ce cas, qu'advient-il si le thread est avec force tué? Faire les fonctions internes (AddRecord
, DeleteRecord
) à terminer leur exécution après nous avons tué le fil?
OriginalL'auteur Aneesh Narayanan | 2012-05-24
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous dire que vous êtes en utilisant
TerminateThread()
de la manière suivante:Si c'est le cas, alors non, le thread exécutant
RecordThread()
sera arrêté exactement où il est pour le moment que l'autre thread appelleTerminateThread()
. Selon les notes dans leTerminateThread()
de la documentation, de ce point est quelque peu aléatoire et dépend de complexes problèmes de synchronisation qui sont hors de votre contrôle. Cela implique que vous ne pouvez pas gérer correctement le nettoyage à l'intérieur d'un thread et donc, vous devez rarement, si jamais, tuer un thread.La bonne façon de demander le fil à la fin, est en utilisant
WaitForSingleObject()
comme suit:TerminateThread
peut tuer votre fil dans le milieu de lai++
déclaration. Il n'essayez pas de rechercher le "gentil" points tels que les appels de fonction.Notez que POSIX est très différente de l'API Win32 en ce sens (par défaut, sauf si le thread a modifié son annulation paramètres), il sera en effet seulement de tuer votre fil à une annulation point. Donc en plus d'être dangereux, il n'est même pas aussi dangereux partout, et ne sont donc pas "portable" 🙂
Si ce n'est pas évident de les autres commentaires, quelques raisons de plus pourquoi vous devriez ne jamais les utiliser TerminateThread: Windows a commencé à ramasser les morceaux vraiment gros de TerminateThread des ordures sur le trottoir, mais c'est toujours les ordures sur le trottoir
OriginalL'auteur André Caron
tuer le thread est le dernier recours - André a indiqué qu'il laisse de données en état inconnu, vous ne devriez jamais faire que si la thread travaille sur des objets partagés. Les meilleurs choix de notifier fil pour terminer le travail par:
-utilisation de global volatils (important) de la variable qui n'est modifiée que par le thread principal et testé par les travailleurs
-à l'aide de signal type de synchronisation des objets (principalement des Événements), également définies par thread principal et testé par les travailleurs
OriginalL'auteur Piotr Tkaczyk
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682659%28v=vs.85%29.aspx
Cependant les appels de fonction sera évidemment terminé parce qu'ils sont appelés à témoigner devant le ExitThread().
comme en single-threaded code séquentiel cohérence garantit que toutes les lignes avant ExitThread() se termine.
OriginalL'auteur Vladimir Sinenko
exemple de Fil qui fonctionne bien:
appeler le Thread avec: th_espectro.Start();
OriginalL'auteur octavio oli