0

私には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がメインループに再び入ることができ、それは非常に予測不可能です。

この状況は別の方法で解決できますか?

4

1 に答える 1

2

あなたは古典的な生産者/消費者問題を抱えています。標準の(そして99%の場合は十分な)ソリューションは、ミューテックスで保護されたキューです。あなたの場合、キューのサイズは1ですが、キューのセマンティクスは引き続き適用されます。

サンプルの実行は次のようになるため、これで問題が解決します。

Thread 1: Lock queue, see that queue is empty, wait for queue full signal
Thread 2: Produce data
Thread 2: Lock queue, push data into queue (has now size 1), Unlock queue and wake up Thread 1
Thread 2: Produce data
Thread 2: Lock queue, see that queue is full, wait for queue space signal
Thread 1: Wakes up, gets data, sends queue space signal
于 2012-05-21T19:46:10.130 に答える