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

  • 请注意,您可能永远不会得到“No items try near”,因为循环被完全跳过,例如:

    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;