Я хочу использовать boost::atomic
для кольцевого буфера без ожидания, как описано здесь:
Мой producer
одновременно предоставляет большой объем данных (беззнаковый символ, +- 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;
}
next_head
могло завернуться. В этом случае у вас нет непрерывного блока и вы не можете выполнить одинmemcpy
(конечно, вы можете проверить этот случай и, возможно, сделать два). - person Useless   schedule 01.06.2013