boost::atomic
ここで説明されているように、待機のないリングバッファーに使用したい:
Myproducer
は同時に大量のデータ (unsigned char、+- 3000 の値) を提供します。行ごとに入力するマトリックスと同じです。push
バッファ内のこれらの値に最適な方法は何ですか? それらをループするだけmemcpy
ですか、それとも何とか内部に入れることができますか?
pop
同時にたくさんの値を読みたい場合も同様です...
これが私が思いついたものです。これが良くない理由は何ですか? 確認する必要がありRINGBUFFERSIZE % iSize = 0
ます。
#define RINGBUFFERSIZE = 30000
ring_[RINGBUFFERSIZE];
bool push(unsigned char* iData, int iSize)
{
size_t head = head_.load(boost::memory_order_relaxed);
size_t next_head = next(head,iSize);
if (next_head == tail_.load(boost::memory_order_acquire))
return false;
memcpy(ring_+head,iData,iSize);
head_.store(next_head, boost::memory_order_release);
}
bool pop(unsigned char * value, int iSize)
{
size_t tail = tail_.load(boost::memory_order_relaxed);
if (tail == head_.load(boost::memory_order_acquire))
return false;
value = &ring_[tail];
tail_.store(next(tail,iSize), boost::memory_order_release);
return true;
}
size_t next(size_t current, int iSize)
{
return (current + iSize) % RINGBUFFERSIZE;
}