リングバッファ
Ring buffer
バッファの内、先頭と終端がつながったように取り扱うもの。
リングキューとも呼ばれる。
通常は固定サイズの配列で、剰余(mod)を使って位置を取り扱う。 配列要素が16個であれば、要素番号として0~15番の後、再び0番として順繰りに使うことになる。位置を16で割った余りを実際の要素番号として使う。
書き込み位置と読み出し位置のインデックスが同じになった時、バッファが空なのか満杯なのかの区別がつかなくなるため、必ず書き込み位置は読み出し位置の1つ手前で止める必要がある。
バッファのサイズより2^2は大きな型にしておいて、オーバーフロー時には巡回させるのが簡単。
入力インデックス - 出力インデックス = 現バッファサイズ
バッファが満杯になるとそれ以上入れられなくなる。このため、必要な最大サイズを予め決めておく必要がある。
参考
マルチスレッドでの読み書きの競合を減らすために、キャッシュされた書き込み位置、読みだし位置を使う方法