DLLで使用するとBoost Spiritがクラッシュする
-
08-07-2019 - |
質問
Boost.SpiritおよびBoost.Threadの使用中にクラッシュが発生しています 私のアプリケーションのライブラリ。これは、スピリットを使用した場合にのみ発生します メインスレッドからのプロセスの存続期間中のパーサー。
クラッシュは終了時に発生し、次のもののクリーンアップに関連しているようです。 Spiritパーサーによって割り当てられたスレッド固有のストレージ。 DLLのシーケンスが原因でクラッシュしている可能性があります スレッド固有のメモリがDLL内で割り当てられるため、アンロードされます 既にアンロードされています。ただし、Boost.Thread DLLは、アプリケーション自体が終了するまでアンロードされません。
スピリットに特定のスレッドをクリーンアップさせる方法はありますか ストレージ、例えばプロセスのデタッチ通知を受け取ったときに私のdll-mainで?
任意のソリューション/ヒントをいただければ幸いです。
PS! 私のプラットフォームと設定:
- Visual Studio 2005
- BOOST_ALL_DYN_LINK
- BOOST_SPIRIT_THREADSAFE
解決
さて、回避策を見つけました。
boost :: spirit :: parse呼び出しを使用するすべての場所で、基本的にworkerthreadを生成して実行しますが、呼び出しスレッドはworkerthreadとの結合呼び出しをブロックしています。理想的ではありませんが、これまでのところ副作用なしで機能しているようです。
私の直感では、別のスレッドは必要ありません。
他のヒント
Boost.Spiritはヘッダー専用です。つまり、独自のdllには存在しないため、dllのアンロード順ではなく、別の問題が発生している可能性があります。
スピリットパーサーを含むインスタンスが削除され、宙ぶらりんのポインターが残らないようにします。