2010年10月15日金曜日

DLL_PROCESS_DETACH は難しい

 ちょい記憶が曖昧なのだが、DLL_THREAD_DETACH は、必ずしもコールされるとは限らないのである。APIで無効にできるからだ。そして、DLL_PROCESS_DETACH時の処理も非常に難しい。実は、このタイミングで C|C++ランタイムのクリーンアップ処理が自動で実行されるからだ(Vista, 7 では、どうかわからん)。
 よって、DLL_PROCESS_DETACH のタイミングで、スレッドの同期保護オブジェクトを利用して何かを実行しようとすると、たいていは、デッドロックを起こしてしまう。とにかく、厄介な代物なのである。
 MSには、DLL_PROCESS_DETACH の他に、DLL_PROCESS_DETACHING とかいった通知をDLL_PROCESS_DETACHの前にしてもらいたいと希望したい。そうすれば、デッドロックを起こさずに済む。結局のところ、このような仕様のおかげで、マルチスレッド絡みで、ほいほいとDLLをロードしたりアンロードしたりできない。つか、不可能だろう。皆さん、どうされているのだろうか?あ?C#使ってるから、関係ねぇのか!

0 件のコメント: