2つのバッファがあるとしましょう。プロデューサーはバッファー#1を満たし、次にバッファー#2を満たします。コンシューマーは一度に1つのバッファーを消費し、非常に低速です。バッファー#1を消費している間、プロデューサーは別のバッファーをいっぱいにする準備ができていますが、それらはすべていっぱいであり、コンシューマーはまだ#1を終了していません。それで、プロデューサーは待ちます。
待つのではなく、プロデューサーに「空き」バッファーを更新してもらいたい。つまり、コンシューマーがバッファー#1を消費している間、プロデューサーはバッファー#2の準備ができたらすぐに新しいデータをバッファー#2に書き込む必要があります(「古い」データは上書きされて失われます)。コンシューマーがまだ#1を終了しておらず、プロデューサーが書き込むデータがさらにある場合は、 #2に再度書き込む必要があります。コンシューマーが最終的に#1のすべてのデータを消費すると、すぐにバッファー#2に新しく書き込まれたデータの消費を開始し、プロデューサーは#1を更新し続ける必要があります。
(プロデューサーがビデオフレームを高速でリアルタイムで取得し、コンシューマーがゆっくりと作成していると想像してください。コンシューマーは、一部のフレームをスキップしてもかまいませんが、最後に取得したフレームを常に処理する必要があります。代わりに、プロデューサーはできません。すべてのフレームを取得する必要があるため、速度を落とすか待つことはありません)。
セマフォでこの種のことを行う方法はありますか?それはよく知られている並行性の問題ですか?そして、場合によっては、この問題をn> 2個のバッファーに拡張することは可能ですか?
ありがとう!