C++ 优先级队列处理优先级的未签名溢出
我在多个线程中处理项目,生产者可能会无序地将它们输出到缓冲区。一些后期管道阶段不是无记忆的,我需要将部分处理的项目按顺序排列,因此我有一个线程从前一阶段工作人员输出的缓冲区收集它们,并将它们放入一个标准的基于堆的优先级队列,当项计数器是最后一个被提取项的后续项时,从堆的顶部提取 该项由生成它们的硬件用32位无符号计数器压印。每秒有几千件物品,几天后柜台就会自动关闭。在不切换到64位计数器的情况下如何处理此问题?该程序需要能够无限期运行 [编辑]C++ 优先级队列处理优先级的未签名溢出,c++,priority-queue,unsigned,integer-overflow,C++,Priority Queue,Unsigned,Integer Overflow,我在多个线程中处理项目,生产者可能会无序地将它们输出到缓冲区。一些后期管道阶段不是无记忆的,我需要将部分处理的项目按顺序排列,因此我有一个线程从前一阶段工作人员输出的缓冲区收集它们,并将它们放入一个标准的基于堆的优先级队列,当项计数器是最后一个被提取项的后续项时,从堆的顶部提取 该项由生成它们的硬件用32位无符号计数器压印。每秒有几千件物品,几天后柜台就会自动关闭。在不切换到64位计数器的情况下如何处理此问题?该程序需要能够无限期运行 [编辑] 我的一个想法是,由于堆的大小限制为几百万个项目,我
我的一个想法是,由于堆的大小限制为几百万个项目,我可以修改堆比较器,以检查被比较的计数器之间的差异,并设置一个阈值,比如说未签名的最大值的一半,如果超过该阈值,将被视为发生了环绕。缺点是在堆操作中检查的每个项都有额外的条件开销,我不知道是否有某种方法可以将其减少为减法/强制转换/等的组合,只需一次比较。使用第二个队列如何。当当前队列为空时,insert操作将在wrap和popping开关上切换,或者只对活动队列使用一个标志使用第二个队列如何。当当前队列为空时,“插入”操作将打开“换行”和“弹出”开关,或者只对活动队列使用一个标志。@RichardCriten将此作为答案发布,我将向上投票: