的如下描述:升壓原子:無等待環形緩衝區大量我想用<code>boost::atomic</code>一個免費的等待環緩衝器的數據
我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'(當然,你可以檢查這個案例,也可以做兩個)。 – Useless