ここで説明するようなスレッドプールを実装しました
非常に単純な実装で、正常に動作しますが、アプリケーションがシャットダウンしなくなりました。2つのワーカースレッド(および他の1つのスレッド、キューイングスレッド)が関数でスタックしているようです
ntdll.ZwRemoveIoCompletion
QueueUserWorkItem(スレッドプールの実装で使用されるWinAPI関数)のヘルプエントリでIOの完了について何か読んだことを覚えていますが、正しく理解できませんでした。実行に時間がかかる可能性があり、既存のワーカースレッドが終了するのを待つのではなく、新しいワーカースレッドを作成する必要があるため、ワーカースレッドにWT_EXECUTELONGFUNCTIONを使用しました。ワーカースレッドに割り当てられたタスクの一部は、I/O処理を実行します。WT_EXECUTEINIOTHREADを使用しようとしましたが、役に立たないようです。
メインスレッドは、コールスタックが存在しないクリティカルセクションへのエントリを待機していることに注意してください。
System.Halt0, System.FinalizeUnits, Classes.Finalization, TThread.Destroy,
RtlEnterCriticalSection, RtlpWaitForCriticalSection
私がここで間違っていることについて何か考えはありますか?よろしくお願いします。