私は2つのバッファを持っているとしましょう。プロデューサはバッファ#1を満たし、次いでバッファ#2を で満たす。消費者は一度に1つのバッファを消費し、それは非常に遅いです( )。それはバッファ#1を消費している間、プロデューサは別のバッファ を埋める準備ができていますが、それらはすべていっぱいであり、コンシューマは#1でまだ完了していません 。だから、プロデューサーは待っています。単純なプロデューサ - コンシューマの問題ですが、プロデューサは古いバッファを更新します
代わりに、私はプロデューサーに "フリー"バッファーを更新してもらいたいです。 つまり、消費者がバッファ#1を消費している間に、プロデューサ は、準備が整うとすぐにバッファ#2に新しいデータを書き込む必要があります( "古い"データが上書きされて失われます)。コンシューマが#1でまだ を終了していない場合、プロデューサに書き込むデータがさらにある場合は、 #2のように書く必要があります。 消費者が最終的に#1のすべてのデータを消費すると、 は即座にバッファ#2の新しく書き込まれたデータを消費し始め、 となり、プロデューサは#1の更新を継続する必要があります。
(プロデューサーがビデオフレームを高速でリアルタイムで取得しているとしますが、消費者はゆっくりと精緻化していますが、消費者は フレームをスキップしても構わないと考えています。代わりに、毎フレーム を取得する必要があるため、遅くしたり待機したりすることはできません。
セマフォでこのようなことを行う方法はありますか?並行性に問題がありますか? そして、その場合、 この問題をn> 2のバッファにまで拡張することは可能ですか?
ありがとうございます!
不都合なことに、n = 2のバッファの場合も解決策が必要です(バッファが非常に大きく、メモリがそうでない場合、消費者速度を犠牲にして2つのバッファを使用する必要があります)。 – janesconference
私はいくつかの編集を追加しました。 – CookieOfFortune