2008-11-20 6 views
4

Je rencontre un crash lors de l'utilisation des bibliothèques Boost.Spirit et Boost.Thread dans mon application. Cela ne se produit que si j'ai utilisé l'analyseur Spirit pendant la durée de vie du processus à partir du thread principal.Crash Boost Esprit lorsqu'il est utilisé dans les DLLs

L'incident se produit à la sortie et semble être lié au nettoyage du stockage spécifique au thread affecté par l'analyseur d'esprit. Il se bloque probablement en raison de la séquence dont les DLL sont déchargées, car la mémoire spécifique au thread est allouée dans une DLL qui a déjà été déchargée. La DLL Boost.Thread n'est cependant pas déchargée jusqu'à ce que l'application elle-même se termine.

Y at-il un moyen pour moi de forcer Spirit à nettoyer son stockage spécifique au fil , par ex. dans mon dll-principal quand je reçois une notification de processus de détachement?

Toutes les solutions/conseils seraient appréciés.

PS! Ma plate-forme et les paramètres:

  • Visual Studio 2005
  • BOOST_ALL_DYN_LINK
  • BOOST_SPIRIT_THREADSAFE

Répondre

3

Eh bien, j'ai trouvé une solution de contournement.

Chaque fois que j'utilise l'appel boost :: spirit :: parse, je lance un workerthread pour l'exécuter, alors que le thread appelant bloque sur un appel de jointure avec le workerthread. Pas idéal, mais il semble fonctionner sans aucun effet secondaire jusqu'à présent. Toujours intéressé par toutes les alternatives que mon sentiment de l'intestin est qu'un fil séparé ne devrait pas vraiment être nécessaire.

+0

Avez-vous trouvé un rapport de bogue sur ce problème? – EFraim

+0

Je n'ai pas. Mais je n'ai pas suivi ce problème depuis que j'ai trouvé cette solution de contournement. –

1

Boost.Spirit est en-tête uniquement, à savoir qu'il ne réside pas dans son propre dll, alors peut-être n'est pas l'ordre de déchargement des DLL mais plutôt un problème différent.

Assurez-vous que l'instance contenant votre analyseur d'esprit est supprimée et ne laisse pas de pointeurs qui pendent.

+0

Spirit lui-même est un modèle "lib" donc vous avez raison, il ne réside pas dans sa propre DLL. Il est cependant déjà utilisé (et donc les templates instanciés) dans l'une de mes DLLs. On dirait que le pointeur qui pend est réellement généré par l'Esprit lui-même. –

Questions connexes