golang1.23 之前 Reset ?到底有什么问题 在golang 的 time.Reset 文档中有这么一句话,为了防止文档更新而导致内容变动,这里粘贴出来: Before Go 1.23, the only safe way to use Reset was to [Stop] and explicitly dr
golang1.23 之前 Reset ?到底有什么问题在 golang 的 time.Reset 文档中有这么一句话,为了防止文档更新而导致内容变动,这里粘贴出来:
虽然文档中已经告诉了正确使用的方式,但是实际上在真正的代码中无法达到这个要求,参考下方代码(来源代码来源):
在上面的代码中,我们按照文档的要求,在 timer.Reset ?之前已经调用了 Stop ?函数,且如果 Stop 成功(返回 true),还尝试抽取 timer,看起来似乎没问题的代码中仍然存在问题。 问题的关键在于:当 Ticket 触发的时候,设置定时器状态的操作和发送 channel 的操作并不是原子的,见 runOneTimer 函数。 异常情况:尝试抽取 channel 在 发送 channel 之前,这样会导致 Reset 之前并没有真正的清空 timer,后一次的 timer.C 还没到触发时间就异常的触发了!
golang1.23 之前到底应该如何正确的使用 Reset?实际上简洁点就这么写,每次一个新的局部变量 Timer? 结构体没压力,非要复用使用 Reset 的可读性太差了,对维护者不友好,而且习惯了不好的写法,哪天一不小心就写出问题了~
参考: https://tonybai.com/2016/12/21/how-to-use-timer-reset-in-golang-correctly/ https://www.v2ex.com/t/794283 |
2022-04-28
2022-04-21
2022-05-13
2022-08-17
2024-05-07