我在多个线程中处理项目,并且生产者可能无序地将它们输出到缓冲区中。一些后来的管道阶段不是无记忆的,我需要按顺序放置部分处理的项目,所以我有一个线程从前一阶段工作人员输出的缓冲区中收集它们并将它们放入标准的基于堆的优先级队列中,从顶部拉出当项目计数器是最后一个项目的后续项目时,堆的数量。
该项目由生成它们的硬件标记为32位无符号计数器。每秒有几千件物品,几天后柜台就会缠绕。如何在不切换到64位计数器的情况下处理此问题?该程序需要能够无限期运行。
[编辑]
我有一个想法是,由于堆的大小限制为几百万个项目,我可以修改堆比较器来检查被比较的计数器之间的差异,并设置一个阈值,表示最大值的一半。 unsigned,如果超出,将采取假设已发生回绕。缺点是在堆操作中检查每个项目的额外条件的开销,并且我不知道是否有某种方法可以将它减少为减法/强制转换/等的组合。只需一次比较。
答案 0 :(得分:1)
如何使用第二个队列。当前队列为空时,insert操作会打开wrap和popping开关,或者仅使用活动队列的标志