質問

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のアンロード順ではなく、別の問題が発生している可能性があります。

スピリットパーサーを含むインスタンスが削除され、宙ぶらりんのポインターが残らないようにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top