2008-09-25 11 views
9

Le ThreadStatic attribute déclare une variable statique comme unique par thread. Connaissez-vous un modèle facile pour disposer correctement de telles variables?Élimination déterministe des objets ThreadStatic

Ce que nous avons utilisé avant ThreadStatic est un ThreadContextManager. Chaque thread était doté d'un ThreadContext qui conservait toutes les informations spécifiques au thread. Nous avons engendré des threads et les laisser travailler. Puis, quand ils ont tous fini, nous avons éliminé ThreadContentManager, qui à son tour disposait tous les contextes s'ils étaient IDisposable.

Je ne vois pas de moyen immédiat de traduire ce modèle en objets ThreadStatic. Les objets seront éliminés eventuellement, parce que les threads meurent, et donc rien ne les référence. Cependant, nous préférons disposer déterministe autant que possible.

Mise à jour

Je ne contrôle pas vraiment les fils directement - j'utilise Microsoft CCR, qui a une ThreadPool qui fait des tâches. Quand toutes les tâches sont terminées, je dispose du Dispatcher (qui contient le pool de threads). La chose est - je n'ai aucune chance de faire quoi que ce soit "à la fin de la fonction principale d'un thread" - donc je ne peux pas disposer les choses manuellement à la fin de la course d'un thread. Puis-je accéder aux objets statiques du thread depuis l'extérieur du thread?

Répondre

1

Vous pouvez toujours utiliser l'équivalent de votre classe ThreadContextManager pour gérer la disposition. Les threads engendrés disposent de cet objet 'manager' qui à son tour supprime tous les autres objets statiques qu'il connaît.

Je préfère avoir relativement peu d'objets statiques et utiliser à la place un objet contexte. Cela permet de conserver l'état spécifique du thread en seulement quelques endroits, et rend les modèles de ce genre plus faciles.

Mise à jour: Pour gérer le pool de threads, vous pouvez créer un objet 'tâche' de base qui est celui que vous transmettez au pool de threads. Il peut effectuer toute initialisation générique dont votre code a besoin, invoquer la tâche «réelle» et ensuite effectuer tout nettoyage nécessaire.

+0

Je ne veux pas nettoyer après chaque tâche. Tout thread donné dans mon pool de threads effectue de nombreuses tâches de manière séquentielle. La raison de son contexte est d'économiser l'allocation coûteuse de structures de données par tâche. Cela signifie que je ne peux nettoyer qu'après que tous les threads sont terminés. – ripper234

Questions connexes