4

アプリケーションで Boost.Spirit および Boost.Thread ライブラリを使用しているときにクラッシュが発生しました。これは、メイン スレッドからのプロセスの有効期間中に Spirit パーサーを使用した場合にのみ発生します。

クラッシュは終了時に発生し、Spirit パーサーによって割り当てられたスレッド固有のストレージのクリーンアップに関連しているようです。スレッド固有のメモリが既にアンロードされている DLL 内に割り当てられているため、DLL がアンロードされる順序が原因でクラッシュしている可能性があります。ただし、Boost.Thread DLL は、アプリケーション自体が終了するまでアンロードされません。

プロセス デタッチ通知を受け取ったときに、Spirit にスレッド固有のストレージ (たとえば、dll-main 内) を強制的に消去させる方法はありますか?

解決策/ヒントをいただければ幸いです。

PS!私のプラットフォームと設定:

  • ビジュアル スタジオ 2005
  • BOOST_ALL_DYN_LINK
  • BOOST_SPIRIT_THREADSAFE
4

2 に答える 2

3

さて、私は回避策を見つけました。

boost::spirit::parse 呼び出しを使用するすべての場所で、呼び出しスレッドがワーカースレッドとの結合呼び出しをブロックしている間に、基本的にワーカースレッドを生成して実行します。理想的ではありませんが、これまでのところ副作用なしで機能しているようです.

私の直感として、別のスレッドは実際には必要ないはずなので、まだ代替案に興味があります。

于 2008-11-20T17:46:44.207 に答える
1

Boost.Spirit はヘッダーのみです。つまり、独自の dll には存在しないため、dll のアンロード順序ではなく、別の問題である可能性があります。

スピリット パーサーを含むインスタンスが削除され、ダングリング ポインターが残らないようにしてください。

于 2008-11-20T16:31:37.307 に答える