Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优先级队列处理优先级的未签名溢出_C++_Priority Queue_Unsigned_Integer Overflow - Fatal编程技术网

C++ 优先级队列处理优先级的未签名溢出

C++ 优先级队列处理优先级的未签名溢出,c++,priority-queue,unsigned,integer-overflow,C++,Priority Queue,Unsigned,Integer Overflow,我在多个线程中处理项目,生产者可能会无序地将它们输出到缓冲区。一些后期管道阶段不是无记忆的,我需要将部分处理的项目按顺序排列,因此我有一个线程从前一阶段工作人员输出的缓冲区收集它们,并将它们放入一个标准的基于堆的优先级队列,当项计数器是最后一个被提取项的后续项时,从堆的顶部提取 该项由生成它们的硬件用32位无符号计数器压印。每秒有几千件物品,几天后柜台就会自动关闭。在不切换到64位计数器的情况下如何处理此问题?该程序需要能够无限期运行 [编辑] 我的一个想法是,由于堆的大小限制为几百万个项目,我

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

该项由生成它们的硬件用32位无符号计数器压印。每秒有几千件物品,几天后柜台就会自动关闭。在不切换到64位计数器的情况下如何处理此问题?该程序需要能够无限期运行

[编辑]


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

使用第二个队列如何。当当前队列为空时,insert操作将在wrap和popping开关上切换,或者只对活动队列使用一个标志

使用第二个队列如何。当当前队列为空时,“插入”操作将打开“换行”和“弹出”开关,或者只对活动队列使用一个标志。@RichardCriten将此作为答案发布,我将向上投票: