2009-06-04 56 views
0

私は2つのバッファを持っているとしましょう。プロデューサはバッファ#1を満たし、次いでバッファ#2を で満たす。消費者は一度に1つのバッファを消費し、それは非常に遅いです( )。それはバッファ#1を消費している間、プロデューサは別のバッファ を埋める準備ができていますが、それらはすべていっぱいであり、コンシューマは#1でまだ完了していません 。だから、プロデューサーは待っています。単純なプロデューサ - コンシューマの問題ですが、プロデューサは古いバッファを更新します

代わりに、私はプロデューサーに "フリー"バッファーを更新してもらいたいです。 つまり、消費者がバッファ#1を消費している間に、プロデューサ は、準備が整うとすぐにバッファ#2に新しいデータを書き込む必要があります( "古い"データが上書きされて失われます)。コンシューマが#1でまだ を終了していない場合、プロデューサに書き込むデータがさらにある場合は、 #2のように書く必要があります。 消費者が最終的に#1のすべてのデータを消費すると、 は即座にバッファ#2の新しく書き込まれたデータを消費し始め、 となり、プロデューサは#1の更新を継続する必要があります。

(プロデューサーがビデオフレームを高速でリアルタイムで取得しているとしますが、消費者はゆっくりと精緻化していますが、消費者は フレームをスキップしても構わないと考えています。代わりに、毎フレーム を取得する必要があるため、遅くしたり待機したりすることはできません。

セマフォでこのようなことを行う方法はありますか?並行性に問題がありますか? そして、その場合、 この問題をn> 2のバッファにまで拡張することは可能ですか?

ありがとうございます!

答えて

0

まあ、バッファのバッファ(キュー)を持つことができます。どのバッファが使用されているかを判断するための同期型キュー構造のタイプ。これは、n> = 2のバッファで動作します。

プロデューサーはバッファ1に書き込みを開始しますが、キューからは削除しません。コンシューマはバッファ1から消費を開始し、それをキューから削除します。バッファー1がいっぱいになると、プロデューサーはキューをチェックして使用可能なバッファーを確認し、バッファー2のみが使用可能であることを確認します。プロデューサはバッファ2に書き出しを開始します。バッファ2がいっぱいになったら、キューを再度チェックして、バッファ2がまだ使用可能であることを確認します。消費者はバッファ1で完了すると、バッファ2をキューから除去し、バッファ1を元に戻す。プロデューサが2で終了すると、バッファ1だけが使用可能であり、バッファ1に書き込むことを開始します。私はこれがあなたが描いていたものであることを望みます。 (私はセマフォだけを扱うのは好きではない、より高いデータ構造、例えばキューを使うことを好む。

複数のプロデューサを処理するには、別のキューを導入して、どのバッファがプロデューサによって使用されているかを判断します。今はプロデューサキューとコンシューマキューがあり、あなたの状況をすべて処理すると思います。

+0

不都合なことに、n = 2のバッファの場合も解決策が必要です(バッファが非常に大きく、メモリがそうでない場合、消費者速度を犠牲にして2つのバッファを使用する必要があります)。 – janesconference

+0

私はいくつかの編集を追加しました。 – CookieOfFortune

関連する問題