我这样声明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
)。我能以某种方式这样做吗?我的存储足够大,我处理得足够快,所以我确信我可以直接使用存储指针。
答案 0 :(得分:2)
你不能。
这是完全必需的,因此SPSC队列可以以无锁方式实现(假设固定容量)。
你也不能吃蛋糕,也不能吃。
此外,您已经过了微优化。
您的探查者是否告诉您这是您的性能瓶颈?(提示:不,它没有)。
答案 1 :(得分:0)
从队列中弹出一个项目后,其内容可能会在任何时间点被覆盖;如果队列已满或接近满,请尽快而不是更晚。
因此,在项目被标记为弹出之前移动/复制内容必需,否则会导致内存损坏。
如果你只想要一个指向元素的指针......解决方案就是建立一个指针队列。在boost::shared_ptr<fut_sess_contents>
上定义你的队列,只会复制该指针(在C ++ 11中,如果支持,你应该更喜欢std::unique_ptr<fut_sess_contents>
)。