我正在通读 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个赞
在给定的示例中,可以执行以下操作:
通话时间。AfterFunc()
时间。AfterFunc() 启动一个等待计时器攻击的 goroutine。时间。Afterfunc继续运行。
定时器罢工,调用余真菌
在Func调用t.Reset->恐慌之后,因为t将在步骤5处设置
调用时间。AfterFunc() 返回,设置 t
- 1 回答
- 0 关注
- 86 浏览
添加回答
举报
0/150
提交
取消