1

配列と 2 つのインデックス (1 つは読み取り用、もう 1 つは書き込み用) で構成される C の循環バッファーとして、標準の単一コンシューマー、単一プロデューサー キューを実装しました。

私の循環バッファーは、満杯のキューに項目を挿入しようとするとエラーを返し、1 つの空のスロットを使用して空のリング バッファーと満杯のリング バッファーを区別するタイプです。

デバッグ中に、常に挿入を行う進行中のスレッドがあったにもかかわらず、バッファーがいっぱいであることを意味する戻り値を取得する前に、一度に 1 つの項目しか読み取れない一貫した状態に陥ることがあることに気付きました。

実装でばかげたことをしたに違いないと思いましたが、何も見つかりませんでした。次に、ロジックを再確認し、そのようなキューを説明するウィキペディアの値を読み直すことにしました。

驚いたことに、テキスト内に次の不可解なコメントがあることに気付きました。

バッファ境界を越えて読み取ることができない場合、一度に 1 つの要素しか読み取ることができない状況が数多く発生します。

したがって、意味を正しく理解している場合、これは、このようなリング バッファーの実装方法に何らかの継承の問題があることを示しているようです。

悲しいかな、私の弱い脳は、この問題の根本原因を理解するのに途方に暮れています。なぜこれが起こっているのでしょうか? このようなリングバッファをこの状態にすることができるのは、どのような挿入と消去のシーケンスですか?

大変お世話になりました。

4

1 に答える 1

1

うーん、同時実行の問題が発生しないように、関数の同期に注意を払っていると思いますか? そうしないと、バッファの動作がランダムに悪くなる可能性があります

于 2010-05-06T15:23:18.653 に答える