C++ 增强spsc_队列-如何;试试流行音乐;?
我有这样的问题:C++ 增强spsc_队列-如何;试试流行音乐;?,c++,boost,lock-free,C++,Boost,Lock Free,我有这样的问题: boost::lockfree::spsc_queue<orders_log, boost::lockfree::capacity<8192>> futOrdersUpdates; 想法是-如果未设置endOfTransaction标志,我应该“旋转”,否则如果队列为空,我可以退出 在日志中,我发现了一些奇怪的东西: “没有项目,请重试”-永远不会出现 “重复项目!”-将出现 预期行为: 当队列为空但未设置endOfTransactio
boost::lockfree::spsc_queue<orders_log, boost::lockfree::capacity<8192>> futOrdersUpdates;
想法是-如果未设置endOfTransaction
标志,我应该“旋转”,否则如果队列为空,我可以退出
在日志中,我发现了一些奇怪的东西:
- “没有项目,请重试”-永远不会出现
- “重复项目!”-将出现
- 当队列为空但未设置
标志时,有时应显示“无项目,重试”endOfTransaction
- “重复项目!”不应出现
问题是-如果我是“dequee”spsc_队列正确吗?我的代码中有错误吗?我们不可能知道您为什么会得到重复的代码,因为我们不知道您如何填写
replRev
。这可能是一场数据竞赛(例如,我希望你不要做lastRev+1
)
while (bool dequeued = foo())
{
assert(dequeued); // can never be false here!
}
永远不会进入循环bool dequeued = futOrdersUpdates.pop(entryItem) || !endOfTransaction;
如您所知(请参阅您的评论),这将强制出列
为真,即使没有项目出列,因为尚未设置endOfTransaction
此时未指定entryItem
的值,但很可能只包含上一个值,导致出现“重复”消息有关使用我最近给出的
spsc|u queue
的演示,请参见以下答案:I have| |!endOfTransaction
因此出列
可能是false
。问题是-如果我正确使用spsc\u队列
。@javapowered我希望我详细的回答能帮助解释。对于“我是否正确使用spsc|U队列”的其余答案,由于第一段中所述的原因无法给出。嗯,似乎我应该只写((bool dequeued=futOrdersUpdates.pop(entryItem))| |!endOfTransaction)
@javapowered,如果这样可以编译的话。。。查看链接的答案,了解我是如何处理关闭标志的。很明显,您是在多个使用者的情况下,因此当多个使用者同时弹出队列时,使用spsc队列是一个非常糟糕的主意。由于boost::lockfree(现在)没有用于单个生产者/多消费者的容器,我建议您使用类boost::lockfree::queue,它是多生产者/多消费者。不,我有一个生产者一个消费者,完全误读了。对不起。
bool dequeued = futOrdersUpdates.pop(entryItem) || !endOfTransaction;