定时器实现过程的bug总结

定时器是参考linux内核定时器设计实现的. 遇到了两个比较致命而且比较隐蔽的bug.

用了各种方法debug, 看来是确实是代码写挫了.

       

 bug1: 

         在后一个时间轮子向前一个时间轮子迁移定时器时步骤:

         1. 移除后一个时间轮子头指针指向的双向链表表头的定时器.

         2. 重新插入该定时器.

         3. 重复1, 2直到该双向链表为空.

         问题: 移除的定时器可能会重新插入到当前的双向链表, 出现这情况就会导致死循环.

         改进: 先把移除的定时器保存起来, 在移除完后再一次性插入.

 

bug2:

        根据bug1修改后迁移定时器时步骤:

         1. 移除后一个时间轮子首指针指向的双向链表表头的定时器.

         2. 把该定时器放到缓存里.

         3. 重复1, 2直到该双向链表为空.

         4. 插入缓存里的定时器.

         5. 后一个时间轮子头指针顺时针移一格, 如果头指针回到了起始位置, 则继续和下一个轮子重复以上动作.

         问题: 当缓存里的定时器是在原来头指针指向的格子时, 而恰好还没到时间迁移到前一个轮子,这时这定时器会重新插到头指针指向的格子(这就是导致bug1发生的情况),  看起来是没什么问题,不过下一步头指针移动后, 该定时器就相当于延长了一个轮子的时间, 只能等到下一次头指针重新移到该格子上时才能触发这定时器.

 

         两个bug都是在特殊情况下才发生. 测试的时候没测出来, 在写定时心跳时, 才艰难地发现. 必需得继续努力..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值