1

関数 InitInstance と ExitInstance を持つ Windows DLL があります。DLL は、いくつかのスレッド、_beginthreadex を持つワーカー スレッド、および CWinThread (MFC) から派生したメッセージ キューを持つスレッドを作成します。

DLL は、どのアプリケーションでも使用できる必要があります。

この DLL をテストするための小さなホスト アプリケーションを作成しましたが、以前に FreeLibrary を呼び出さずにこのホスト アプリケーションを閉じた場合を除いて、正常に動作しました。この場合、ExitInstance も呼び出されますが、すべてのスレッドが消えます。これは非常に珍しいことであり、終了または強制終了されたために、もはや存在しないスレッドが終了するのを待っているいくつかのルーチンがデッドロックにつながります。他のアプリケーションがこの DLL を使用したときに何が起こるかをシミュレートするために、この方法 (FreeLibrary の呼び出しをスキップ) を実行する必要があります。

ExitInstance が呼び出されますが、通常はまだ実行中のすべてのスレッドが消えます。おそらく、以前に FreeLibrary を呼び出さないと、ホスト プロセスからアンロードされたときに DLL が何らかの方法で処理されるためです。

たとえば、スレッドがループ内で WaitForSingleObject を使用してループを実装しただけの場合、このスレッドは正常に終了しません。

thread()
{
    while(running == true)
    {
        WaitForSingleObject(...);
    }
    threadfinished=true; /// 1
}

アプリケーションを閉じる前に FreeLibrary を呼び出すと、コード セクション 1 が呼び出されます。以前に FreeLibrary を呼び出さずにアプリケーションを閉じると、コード セクション 1 が呼び出されることはありませんが、スレッドが削除されたため、ループも実行されなくなりました。

この状況をどのように処理すればよいですか? ありがとうございました

4

1 に答える 1