futOrdersUpdates; 我的问题是有时我会多次使用同一个项目。我添加了一些故障排除代码: while (-6ren">
gpt4 book ai didi

c++ - boost spsc_queue - 如何 "try pop"?

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:21 25 4
gpt4 key购买 nike

我有这样的队列:

    boost::lockfree::spsc_queue<orders_log,  boost::lockfree::capacity<8192>> futOrdersUpdates;

我的问题是有时我会多次使用同一个项目。我添加了一些故障排除代码:

while (bool dequeued = futOrdersUpdates.pop(entryItem) || !endOfTransaction)
{
if (!dequeued) {
dequeueLoger.Debug("no items, try again");
continue;
} else {
if (lastRev != 0 && entryItem.replRev == lastRev) {
dequeueLoger.Debug("duplicate item!");
}
lastRev = entryItem.replRev;
}
// further processing

想法是 - 如果未设置 endOfTransaction 标志,我应该“旋转”,否则如果队列为空我可以退出。

在日志中我发现了一些奇怪的事情:

  • “没有项目,再试一次”- 永远不会出现
  • “重复项!” - 出现了。

预期行为:

  • “没有项目,重试”有时会出现 - 当队列为空但未设置 endOfTransaction 标志时
  • “重复项!”永远不应该出现

问题是 - 如果我正确地“出队”spsc_queue?我的代码中有错误吗?

最佳答案

我们不可能知道您为什么会重复,因为我们不知道您如何填写 replRev。这可能是一场数据竞赛(例如,我希望你不要做 lastRev+1)。

  1. 请注意,您可能永远不会收到“No items try again”,因为循环已被完全跳过,例如:

    while (bool dequeued = foo())
    {
    assert(dequeued); // can never be false here!
    }

    永远不会进入循环。

  2. 你得到重复的原因是因为你说

    bool dequeued = futOrdersUpdates.pop(entryItem) || !endOfTransaction;

    如您所知(请参阅您的评论)这强制 dequeuedtrue 即使没有项目出列,因为 endOfTransaction 尚未设置。

    当时 entryItem 的值未指定 - 但可能只包含以前的值,从而导致“重复”消息。

有关使用我最近提供的 spsc_queue 的精彩演示,请参阅此答案:Dynamic generation & safe usage of spsc_queues

关于c++ - boost spsc_queue - 如何 "try pop"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23271134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com