2010-05-18 4 views
0

J'essaye d'implémenter des threads d'utilisateur dans le noyau Linux 2.4, et j'ai rencontré quelque chose de problématique et inattendu. Contexte: un thread exécute essentiellement une seule fonction et meurt, sauf que lorsque j'appelle thread_create pour la première fois, il doit également faire de thread() un thread (par défaut, ce n'est pas un thread avant le premier appel, ce qui est également le cas lorsque toutes les structures de données associées sont allouées). Comme un thread exécute une fonction et meurt, nous n'avons pas besoin de "retourner" n'importe où avec, mais nous devons sauvegarder la valeur de retour pour être récupéré plus tard avec thread_join, donc le bidouillage que j'ai trouvé était : lorsque j'alloue la pile de threads, je place une adresse de retour qui pointe vers une fonction thread_return_handler, qui libère le thread, en fait un zombie et enregistre sa valeur de retour pour plus tard. Cela fonctionne pour "juste exécuter une fonction et die" threads, mais est très problématique avec le thread principal. Comme il s'agit en fait de la fonction principale, s'il revient avant que les autres threads ne se terminent, le mécanisme de retour normal entre en jeu et libère toutes les ressources partagées, ce qui détraque tous les threads en cours.Attraper le retour de la fonction principale avant qu'il libère des ressources

Je dois l'empêcher de le faire. Des idées sur comment cela peut-il être fait?

+0

Linux 2.4, vraiment? –

+0

@theatrus Remarquez l'étiquette de devoirs. – EpsilonVector

Répondre

1

Vous pouvez enregistrer une fonction avec atexit() appelée à la fin du programme. Notez cependant que vous ne pouvez pas faire la différence entre appeler exit() et revenir de main().

... et cela va au cœur du problème. Traditionnellement, le retour de main() revient à appeler le exit(), ce qui signifie que le processus entier doit être terminé, y compris tous les threads en cours d'exécution. En d'autres termes, le "fil principal" est spécial. Etes-vous sûr que vous ne pouvez pas documenter cela comme comportement attendu? C'est ainsi que les autres modèles de threads UNIX ont tendance à fonctionner, après tout.