我正在多个线程中处理项目,生产者可能将它们无序输出到缓冲区中。某些后期的管道阶段并非没有内存,因此我需要按顺序处理部分处理的项目,因此我有一个线程从前阶段工作人员输出的缓冲区中收集它们,并将其放入基于堆的标准优先级队列中,从顶部开始堆,而项目计数器是最后提取的项目的后继。

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

[编辑]

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

最佳答案

如何使用第二个队列。当前队列为空时,或仅对活动队列使用标志时,插入操作会打开换行和弹出开关

关于c++ - 优先级队列处理优先级的未签名溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45196698/

10-09 06:38
查看更多