【问题标题】:Boost Spirit crash when used in DLLs在 DLL 中使用时 Boost Spirit 崩溃
【发布时间】:2008-11-20 10:15:09
【问题描述】:

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

崩溃发生在出口处,似乎与清理 Spirit 解析器分配的线程特定存储。 它可能由于 DLL 的顺序而崩溃 已卸载,因为线程特定的内存是在 DLL 内分配的 已经卸载了。然而,在应用程序本身退出之前,Boost.Thread DLL 不会被卸载。

有没有办法让我强制 Spirit 清除其特定线程 存储,例如当我收到进程分离通知时在我的 dll-main 中?

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

PS! 我的平台和设置:

  • Visual Studio 2005
  • BOOST_ALL_DYN_LINK
  • BOOST_SPIRIT_THREADSAFE

【问题讨论】:

    标签: c++ boost boost-thread boost-spirit


    【解决方案1】:

    好吧,我找到了解决方法。

    在我使用 boost::spirit::parse 调用的每个地方,我基本上都会产生一个工作线程来运行它,而调用线程在与工作线程的连接调用上阻塞。不理想,但到目前为止它似乎没有任何副作用。

    仍然对任何替代方案感兴趣,因为我的直觉是不应该真正需要单独的线程。

    【讨论】:

    • 你有没有发现任何关于这个问题的错误报告?
    • 我没有。但自从我找到这个解决方法后,我也没有跟踪这个问题。
    【解决方案2】:

    Boost.Spirit 仅是标头,即它不驻留在自己的 dll 中,因此可能不是 dll 的卸载顺序,而是另一个问题。

    确保包含你的精神解析器的实例被删除并且不留下悬空指针。

    【讨论】:

    • Spirit 本身是一个模板“lib”,所以你是对的,它并不驻留在自己的 DLL 中。然而,它在我的一个 DLL 中开始使用(并因此实例化了模板)。看起来悬空指针实际上是由 Spirit 自己生成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多