Arrêt d’un thread
La fin d’un thread a les résultats suivants :
- Toutes les ressources appartenant au thread, telles que les fenêtres et les crochets, sont libérées.
- Le code de sortie du thread est défini.
- L’objet thread est signalé.
- Si le thread est le seul thread actif dans le processus, le processus est terminé. Pour plus d’informations, consultez Fin d’un processus.
La fonction GetExitCodeThread retourne l’arrêt status d’un thread. Pendant l’exécution d’un thread, son status d’arrêt est STILL_ACTIVE. Lorsqu’un thread se termine, son arrêt status passe de STILL_ACTIVE au code de sortie du thread.
Lorsqu’un thread se termine, l’état de l’objet thread passe à signalé, libérant tous les autres threads qui attendaient la fin du thread. Pour plus d’informations sur la synchronisation, consultez Synchronisation de l’exécution de plusieurs threads.
Lorsqu’un thread se termine, son objet thread n’est pas libéré tant que tous les handles ouverts sur le thread ne sont pas fermés.
Comment les threads sont arrêtés
Un thread s’exécute jusqu’à ce que l’un des événements suivants se produise :
- Le thread appelle la fonction ExitThread .
- Tout thread du processus appelle la fonction ExitProcess .
- La fonction de thread retourne.
- Tout thread appelle la fonction TerminateThread avec un handle au thread.
- Tout thread appelle la fonction TerminateProcess avec un handle au processus.
Le code de sortie d’un thread est la valeur spécifiée dans l’appel à ExitThread, ExitProcess, TerminateThread ou TerminateProcess, ou la valeur retournée par la fonction de thread.
Si un thread est terminé par ExitThread, le système appelle la fonction de point d’entrée de chaque DLL jointe avec une valeur indiquant que le thread est en cours de détachement de la DLL (sauf si vous appelez la fonction DisableThreadLibraryCalls ). Si un thread est terminé par ExitProcess, les fonctions de point d’entrée de DLL sont appelées une seule fois, pour indiquer que le processus est en cours de détachement. Les DLL ne sont pas averties lorsqu’un thread est arrêté par TerminateThread ou TerminateProcess. Pour plus d’informations sur les DLL, consultez Bibliothèques de liens dynamiques.
Les fonctions TerminateThread et TerminateProcess ne doivent être utilisées que dans des circonstances extrêmes, car elles n’autorisent pas les threads à propre, ne notifient pas les DLL jointes et ne libèrent pas la pile initiale. En outre, les handles des objets appartenant au thread ne sont pas fermés tant que le processus n’est pas terminé. Les étapes suivantes fournissent une meilleure solution :
- Créez un objet d’événement à l’aide de la fonction CreateEvent .
- Créez les threads.
- Chaque thread surveille l’état de l’événement en appelant la fonction WaitForSingleObject . Utilisez un intervalle de délai d’attente de zéro.
- Chaque thread met fin à sa propre exécution lorsque l’événement est défini sur l’état signalé (WaitForSingleObject retourne WAIT_OBJECT_0).