2008-11-20 50 views
4

在我的应用程序中使用Boost.Spirit和Boost.Thread 库时,我遇到了崩溃。只有在主线程的进程生命周期中使用Spirit 解析器才会发生这种情况。当在DLL中使用Boost Spirit崩溃时

崩溃发生在退出时,似乎与清理由Spirit解析器分配的 线程专用存储有关。 由于线程特定的内存被分配在已被卸载的DLL 中,因此它可能会崩溃,这是由于卸载了哪些DLL的序列为 。然而,Boost.Thread DLL不会被卸载,直到应用程序本身退出。

有没有一种方法可以让我强迫Spirit清理其特定线程 的存储空间,例如:在我的DLL - 主,当我得到一个进程分离通知?

任何解决方案/提示将不胜感激。

PS! 我的平台和设置:

  • 的Visual Studio 2005
  • BOOST_ALL_DYN_LINK
  • BOOST_SPIRIT_THREADSAFE

回答

3

那么我找到了一个解决方法。

我使用boost :: spirit :: parse调用的每个地方,我基本上都会产生一个workerthread来运行它,而调用线程阻塞与workerthread的联接调用。不理想,但它似乎迄今没有任何副作用。

对任何替代品依然感兴趣,因为我的直觉认为不应该需要单独的线程。

+0

您是否发现过有关该问题的任何错误报告? – EFraim 2010-01-21 18:01:42

1

Boost.Spirit是仅标头,即它不驻留在其自己的DLL,所以也许它不是dll的卸载顺序,而是一个不同的问题。

确保包含您的spirit解析器的实例被删除,并且不会留下悬挂指针。

+0

Spirit本身是一个模板“lib”,所以你是正确的,它不驻留在它自己的DLL中。然而,它开始在我的一个DLL中使用(并且因此模板实例化)。看起来悬挂指针实际上是由Spirit本身产生给我的。 – 2008-11-20 16:35:41

相关问题