spsc_queue pop - 避免memcpy?

时间:2014-06-04 06:09:59

标签: c++ boost low-latency

我这样声明spsc_queue

boost::lockfree::spsc_queue<fut_sess_contents,  boost::lockfree::capacity<1024>> futInfoUpdates;

我这样处理:

fut_sess_contents entry_fsc;
while (futInfoUpdates.pop(entry_fsc))
{
    .... work
}

我假设我通过引用和entry_fsc spsc_queue下一个元素传递memcpy。它看起来效果不好,我希望只是获取存储中项目的指针,直接使用存储中的项目(避免额外的memcpy)。我能以某种方式这样做吗?我的存储足够大,我处理得足够快,所以我确信我可以直接使用存储指针。

2 个答案:

答案 0 :(得分:2)

你不能。

这是完全必需的,因此SPSC队列可以以无锁方式实现(假设固定容量)。

你也不能吃蛋糕,也不能吃。

此外,您已经过了微优化。

  

您的探查者是否告诉您这是您的性能瓶颈?提示:不,它没有)。

答案 1 :(得分:0)

从队列中弹出一个项目后,其内容可能会在任何时间点被覆盖;如果队列已满或接近满,请尽快而不是更晚。

因此,在项目被标记为弹出之前移动/复制内容必需,否则会导致内存损坏。

如果你只想要一个指向元素的指针......解决方案就是建立一个指针队列。在boost::shared_ptr<fut_sess_contents>上定义你的队列,只会复制该指针(在C ++ 11中,如果支持,你应该更喜欢std::unique_ptr<fut_sess_contents>)。