为了账号安全,请及时绑定邮箱和手机立即绑定

为什么计时器停止会给出死锁错误?

为什么计时器停止会给出死锁错误?

Go
不负相思意 2022-05-10 16:07:31
我正在创建这个函数来测试创建和停止计时器。运行时出现死锁错误:package mainimport "fmt"import "time"func main() {    livenessTimer := &time.Timer{}    livenessInterval, _ := time.ParseDuration("1m")    for {        fmt.Print("Timer started")        livenessTimer = time.NewTimer(livenessInterval)        select {        case <-livenessTimer.C:            fmt.Print(time.Now())            fmt.Println("timer triggered")        }        if !livenessTimer.Stop() {            // drain timer from channel if any            fmt.Println("drain timer")            <-livenessTimer.C        }    }}当我运行此代码时,我收到此错误:Timer started2009-11-10 23:01:00 +0000 UTC m=+60.000000001timer triggereddrain timerfatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main()    /tmp/sandbox748850751/prog.go:21 +0x2e0Stop建议检查返回值并排空通道的文档。
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

这是文档中的关键部分:

...假设程序尚未从 tC 收到

在您的情况下,计时器已经触发,Stop返回 false,并且您开始在没有其他 goroutine 运行的通道上等待,因此出现死锁。


查看完整回答
反对 回复 2022-05-10
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信