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

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

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

Go
慕桂英546537 2022-08-15 19:16:06
我正在通读 https://blog.golang.org/race-detector,我不完全相信为什么示例 1 是竞争条件。以下是具有争用条件的代码摘录(第 14-16 行):11 func main() {12     start := time.Now()13     var t *time.Timer14     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
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

在给定的示例中,可以执行以下操作:

  1. 通话时间。AfterFunc()

  2. 时间。AfterFunc() 启动一个等待计时器攻击的 goroutine。时间。Afterfunc继续运行。

  3. 定时器罢工,调用余真菌

  4. 在Func调用t.Reset->恐慌之后,因为t将在步骤5处设置

  5. 调用时间。AfterFunc() 返回,设置 t


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

添加回答

举报

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