优先级队列处理优先级的无符号溢出

Priority queue handle unsigned overflow of priorities

我在多个线程中处理项目,生产者可能会乱序将它们输出到缓冲区中。一些后面的管道阶段不是无记忆的,我需要按顺序放置部分处理的项目,所以我有一个线程从前一阶段工作人员输出的缓冲区中收集它们并将它们放入标准的基于堆的优先级队列中,从顶部拉堆,而项目计数器是最后一个被拉出的项目的后继者。

项目由生成它们的硬件用 32 位无符号计数器标记。每秒有几千个项目,几天后计数器环绕。在不切换到 64 位计数器的情况下如何处理这个问题?该程序需要能够 运行 无限期。

[编辑]

我的一个想法是,由于堆的大小限制为几百万个项目,我可以修改堆比较器以检查正在比较的计数器之间的差异,并将阈值设置为最大值的一半无符号的,如果超过将被认为发生了环绕。缺点是在堆操作中检查每个项目的额外条件开销,我不知道是否有某种方法可以将其减少到 subtraction/cast/etc 的组合。仅需一次比较。

使用第二个队列怎么样。当当前队列为空时,插入操作会打开 wrap 和 popping 开关,或者只为活动队列使用一个标志