En fin de compte, vous devez considérer chaque fil de discussion comme un mini-processus (c'est ce qu'ils sont sous le capot de toute façon). Pour qu'il s'arrête proprement, vous devez mettre en place une infrastructure supplémentaire qui vous permette, à vous, le thread principal, de lui dire de s'arrêter.
La manière la plus simple de procéder est un système de signalisation, que les inventeurs de POSIX ont compris très tôt et qu'ils exposent donc directement dans le système d'exploitation. Le meilleur exemple réel d'un tel système est celui de la poste américaine. Chaque agent possède une adresse unique à partir de laquelle il peut envoyer et recevoir du courrier (signaux) provenant d'autres adresses, et c'est à l'agent de décider ce qu'il doit faire lorsqu'il reçoit un signal. Certains sont des informations ou du courrier indésirable et sont donc ignorés, tandis que d'autres sont hautement prioritaires et vous les ignorez à vos risques et périls.
Au niveau du code, vous avez besoin des éléments suivants pour que cela fonctionne bien (j'en ai construit quelques-uns pour des programmes de traitement d'images) :
1) Un objet abstrait "Event" ou "ControlSignal". N'hésitez pas à utiliser les événements Windows par défaut ou les signaux linux s'ils sont adéquats.
2) Une sorte de "tuyau" : Le système d'exploitation dispose souvent d'une primitive littérale du noyau APPELÉE "tuyau" qui permet à une extrémité de retirer des données tandis qu'une autre en insère. Ce type de pipe est généralement exagéré pour les communications au sein d'un processus, mais l'objet dont vous avez besoin est conceptuellement équivalent.
3) Code dans vos fils qui récupère les signaux du tuyau et agit en conséquence. 4) Un signal "stop" ou "annulation" que tous les threads reconnaissent.
Bien entendu, il est possible d'interrompre brutalement un thread avec TerminateThread, tout comme on peut utiliser taskkill ou CTRL-C pour tuer un processus. ExitThread est un moyen spécifique à Windows de construire un signal d'arrêt propre comme je le décris en (4), mais vous avez toujours besoin de la boucle while et de "WaitForSingleObject" (3) ainsi que de la poignée spécifique à Windows (2) pour que cela fonctionne.