我正在通读 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
胡说叔叔
相关分类