从官方博客中了解围棋比赛条件示例

我正在通读 https://blog.golang.org/race-detector,我不完全相信为什么示例 1 是竞争条件。以下是具有争用条件的代码摘录(第 14-16 行):


11 func main() {

12     start := time.Now()

13     var t *time.Timer

14     t = time.AfterFunc(randomDuration(), func() {

15         fmt.Println(time.Now().Sub(start))

16         t.Reset(randomDuration())

17     })

18     time.Sleep(5 * time.Second)

19 }

20 

21 func randomDuration() time.Duration {

22     return time.Duration(rand.Int63n(1e9))

23 }

这篇博客文章继续解释为什么存在竞争条件:


如果初始计时器持续时间非常小,则计时器函数可能会在主 goroutine 为 t 赋值之前触发,因此对 t.Reset 的调用是使用 nil t 进行的。


我没有遵循为什么持续时间对返回值很重要。即使在单独的 goroutine 中运行,在继续执行其代码之前,它不会提供返回值吗?在填充返回值的足够长的持续时间下,会发生什么变化?time.AfterFunc


慕桂英546537
浏览 87回答 1
1回答

胡说叔叔

在给定的示例中,可以执行以下操作:通话时间。AfterFunc()时间。AfterFunc() 启动一个等待计时器攻击的 goroutine。时间。Afterfunc继续运行。定时器罢工,调用余真菌在Func调用t.Reset->恐慌之后,因为t将在步骤5处设置调用时间。AfterFunc() 返回,设置 t
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go