0

2つのバッファがあるとしましょう。プロデューサーはバッファー#1を満たし、次にバッファー#2を満たします。コンシューマーは一度に1つのバッファーを消費し、非常に低速です。バッファー#1を消費している間、プロデューサーは別のバッファーをいっぱいにする準備ができていますが、それらはすべていっぱいであり、コンシューマーはまだ#1を終了していません。それで、プロデューサーは待ちます。

待つのではなく、プロデューサーに「空き」バッファーを更新してもらいたい。つまり、コンシューマーがバッファー#1を消費している間、プロデューサーはバッファー#2の準備ができたらすぐに新しいデータをバッファー#2に書き込む必要があります(「古い」データは上書きされて失われます)。コンシューマーがまだ#1を終了しておらず、プロデューサーが書き込むデータがさらにある場合は、 #2に再度書き込む必要があります。コンシューマーが最終的に#1のすべてのデータを消費すると、すぐにバッファー#2に新しく書き込まれたデータの消費を開始し、プロデューサーは#1を更新し続ける必要があります。

(プロデューサーがビデオフレームを高速でリアルタイムで取得し、コンシューマーがゆっくりと作成していると想像してください。コンシューマーは、一部のフレームをスキップしてもかまいませんが、最後に取得したフレームを常に処理する必要があります。代わりに、プロデューサーはできません。すべてのフレームを取得する必要があるため、速度を落とすか待つことはありません)。

セマフォでこの種のことを行う方法はありますか?それはよく知られている並行性の問題ですか?そして、場合によっては、この問題をn> 2個のバッファーに拡張することは可能ですか?

ありがとう!

4

1 に答える 1

0

さて、あなたはただバッファのバッファ(キュー)を持つことができます。使用されているバッファーを判別するための、ある種の同期キュー構造。これは、n>=2個のバッファーで機能します。

これは次のように機能すると思います。プロデューサーはバッファー1への書き込みを開始しますが、キューから削除しません。コンシューマーはバッファー1からの消費を開始し、キューから削除します。バッファー1がいっぱいになると、プロデューサーはキューをチェックして使用可能なバッファーを確認し、バッファー2のみが使用可能であることを確認します。プロデューサーはバッファー2への書き込みを開始します。バッファー2がいっぱいになると、キューを再度チェックし、バッファー2がまだ使用可能であることを確認するため、再度書き込みを行います。コンシューマーがバッファー1の処理を完了すると、キューからバッファー2を削除し、バッファー1を元に戻します。プロデューサーが2を使い終えると、バッファー1のみが使用可能であることがわかり、書き込みを開始します。これがあなたが説明していたことだといいのですが。(私はセマフォだけを扱うのは好きではありません。キューなどのより高いデータ構造を使用することを好みます)。

複数のプロデューサーを処理するには、別のキューを導入して、プロデューサーが使用しているバッファーを判別します。これで、プロデューサーキューとコンシューマーキューができました。これですべての状況に対応できると思います。

于 2009-06-04T21:18:53.087 に答える