私には2つのスレッドがあります。スレッド2はスレッド1に必要なデータを提供し、スレッド1がそれを処理するのと並行して別のデータの処理を開始できますが、スレッド1の速度が遅い場合は、次のデータに移動しません(はい、「スレッド1スレッド2が同時に書き込んだものを読み取ります」、1つではなく2つのバッファーの形式で保護されています)。コードは以下のとおりです。
Thread 1:
while(!shouldexit)
{
// some code
Thread1_Ready = true;
SuspendThread (Thread1_Handle);
}
Thread 2:
while(!shouldexit)
{
while(!Thread1_Ready)
{
// do nothing
}
// some other code
ResumeThread(Thread1_Handle);
}
問題は、スレッド2内のコード全体がスレッド1よりも速く発生する場合SuspendThread
があることです。その結果、スレッド1は、スレッド2のさらに別のサイクルが経過するまで中断されたままになります。これにより、1つのデータがスレッド1で処理されなくなり(あまり良くありませんが、私のアプリケーションでは受け入れられます)、さらに深刻なことに、停止ボタンがトリガーされるshouldexit = true
と、スレッド1は無期限に一時停止モードのままになります。
私が考えた2つの可能な解決策も機能しません:1-Thread1_Ready = true;
後を置くSuspendThread(Thread1_Handle);
(コードThread1_Ready = true;
は明らかに実行されません)2-SuspendThread(Thread1_Handle);
スレッド1からスレッド2の先頭までの行を直前に置き// some other code
ますが、これにより遅延が発生しますどのスレッド1がメインループに再び入ることができ、それは非常に予測不可能です。
この状況は別の方法で解決できますか?