gpt4 book ai didi

Go Timer 在停止时死锁

转载 作者:IT王子 更新时间:2023-10-29 01:40:34 32 4
gpt4 key购买 nike

我正在尝试通过停止和重置计时器来重用它们。我遵循文档提供的模式。这是一个可以在 go playground 中运行的简单示例,它演示了我遇到的问题。

是否有正确的方法来停止和重置不涉及死锁或竞争条件的计时器?我知道使用默认选择涉及 channel 消息传递时间的竞争条件,不能依赖。

package main

import (
"fmt"
"time"
"sync"
)

func main() {
fmt.Println("Hello, playground")

timer := time.NewTimer(1 * time.Second)
wg := &sync.WaitGroup{}
wg.Add(1)

go func(_wg *sync.WaitGroup) {
<- timer.C
fmt.Println("Timer done")
_wg.Done()
}(wg)

wg.Wait()
fmt.Println("Checking timer")
if !timer.Stop() {
<- timer.C
}

fmt.Println("Done")
}

最佳答案

根据timer.Stop文档,有一个关于排空 channel 的警告:

assuming the program has not received from t.C already ...

This cannot be done concurrent to other receives from the Timer's channel.

由于 channel 已经被排空 - 并且永远不会再触发,第二个 <-timer.C将永远阻塞。

关于Go Timer 在停止时死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55400661/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com