是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
What does prevent DOMTimerCoordinator::NextID from entering a endless loop?
我查看了Blink代码库,以回答关于JavaScript中定时器的最大可能数量的问题。
DOMTimerCoordinator::InstallNewTimeout()
创建了新的定时器。它调用NextID()
来检索可用的整数密钥。然后,它将新的定时器和相应的密钥插入到timers_
中。
int timeout_id = NextID();
timers_.insert(timeout_id, DOMTimer::Create(context, action, timeout,
single_shot, timeout_id));
NextID()
在从1到231-1:的循环序列中获得下一个id
int DOMTimerCoordinator::NextID() {
while (true) {
++circular_sequential_id_;
if (circular_sequential_id_ <= 0)
circular_sequential_id_ = 1;
if (!timers_.Contains(circular_sequential_id_))
return circular_sequential_id_;
}
}
如果所有ID都在使用,会发生什么
是什么阻止NextID()
进入无休止的循环?
我在回答这个问题时对整个过程作了更详细的解释。
我需要一点理解,但我相信我做到了。
这些步骤让我明白了这一点
-
circular_sequential_id_
被用作唯一标识符。它没有公开,但从其他信息来看,我怀疑它是一个32位的int
(例如std::int32_t
(。 -
我怀疑
circular_sequential_id_
是class
(或struct
(DOMTimerCoordinator
的成员变量。因此,在NextID()
的每次调用之后;记得";最后返回的值。当输入NextID()
时,circular_sequential_id_
首先递增:++circular_sequential_id_;
-
++circular_sequential_id_;
的增量迟早会导致溢出(Uuuh。如果我没记错的话,这被认为是未定义的行为,但在现实世界中,它大多只是循环。(并变为负值。为了处理这个问题,下一行适合:if (circular_sequential_id_ <= 0) circular_sequential_id_ = 1;
-
循环中的最后一条语句检查生成的ID是否仍在任何计时器中使用:
if (!timers_.Contains(circular_sequential_id_)) return circular_sequential_id_;
如果未使用,则返回ID。否则,“再玩一遍,山姆。";
这给我带来了最合理的答案:
是的,这可能会成为一个无休止的循环。。。
如果231-1个定时器已被占用,因此,所有ID都已被消耗。
-
我认为对于231-1定时器,你会遇到更重要的其他问题。(单独对这些计时器可能需要的存储以及处理所有这些计时器的时间进行成像…(
-
即使231-1计时器不是致命的问题,该功能也可能会继续循环,直到其中一个计时器释放其ID,它可以再次被占用。因此,如果资源(计时器的空闲ID(暂时不可用,
NextID()
将被阻塞。
三思而后行。这种选择是相当理论化的。我不敢相信有人会以这种方式管理有限的资源。
我想,这段代码是在这样的假设下工作的,即永远不会有231-1个定时器同时存在,因此它将通过几次迭代找到一个免费的ID。
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 关于 SIGTSTP 错误和无休止的输入
- 宽藤会话更新无休止循环
- 无字母循环
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 在图像上覆盖文本的程序会产生无休止的字符串错误
- OpenSSL客户端陷入无休止的读取
- 无休止的 do while 循环C++代码
- 循环无休止地做
- 卡死胡同-无休止的循环,没有解决方案
- C++:如果输入不是整数,为什么这段代码会运行一个无休止的循环
- C++无休止的循环瓶颈
- 这无休止地循环是否有明显的原因
- 静态分析工具,用于检测由于类型提升而导致的无休止循环
- c++:在修改c字符串数组时帮助纠正无休止循环
- std::advanced()导致无休止的循环
- 为什么我的函数无休止地循环
- 在无休止地循环cout时执行,忽略cin
- boost::asio系统的无休止循环:第一次连接后出现9个错误
- 我如何阻止它无休止地循环