Bien que mon expérience est avec Windows NT la fonction « noms » sont ceux qui désignent threading génériques ou fonctions processus qui devraient être disponibles dans tous les multiples environnement de threading. Si le thread principal peut déterminer quand le thread enfant en question doit se terminer, il peut le faire en ayant la boucle de thread enfant sur un booléen - comme "terminate_conditon" - ou en terminant le thread à travers son handle.
// child thread
terminate_condition=FALSE;
while (!terminate_condition)
{
// accept connections
}
child_thread_done=TRUE;
// output results
exit_thread();
// main thread
child_thread_done=FALSE;
child_thread=create_thread (...);
// monitor connections to determine when done
terminate_condition=TRUE;
while (!child_thread_done)
{
sleep (1);
}
// or maybe output results here?
exit_process();
Cette solution de terminaison contrôlée nécessite qu'un seul thread écrit dans le booléen child_thread_done et que tout autre thread lit seulement.
Ou
// child thread
while (1)
{
// accept connections
}
// main thread
child_thread=create_thread (...);
// monitor connections to determine when done
kill_thread (child_thread);
// output results
exit_process();
La deuxième forme est messier car il tue tout simplement le fil de l'enfant. En général, il vaut mieux que le thread fils effectue une terminaison contrôlée, en particulier s'il a alloué des ressources (qui deviennent la responsabilité du processus dans son ensemble plutôt que du thread d'allocation).
S'il existe de nombreux threads enfants travaillant avec des connexions, un mécanisme de terminaison synchronisé est nécessaire: soit une structure avec autant de membres que de threads enfants (un thread de terminaison définit son booléen "terminé" sur true, se termine et le thread principal surveille la structure pour s'assurer que tous les enfants booléens «terminés» sont vrais avant de continuer) ou un compteur contenant le nombre de fils enfants qui fonctionnent (lorsqu'un enfant est sur le point de prendre le contrôle exclusif du compteur via un spinlock, le décrémente et le libère le verrou avant de se terminer: le thread principal ne fait rien avant que le compteur ne contienne zéro).
pouvez-vous poster le code pour la boucle while? – Brian