1

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;
}
4

1 に答える 1