【发布时间】:2013-06-21 15:11:17
【问题描述】:
我在看Golang文档中的typical data races,不太明白为什么这个程序有问题:
func main() {
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
go func() {
fmt.Println(i) // Not the 'i' you are looking for.
wg.Done()
}()
}
wg.Wait()
}
当我希望它打印 0, 1, 2, 3, 4(不一定按此顺序)时,它会打印 5, 5, 5, 5, 5。
在我看来,当 goroutine 在循环内创建时,i 的值是已知的(例如,可以在循环开始时执行 log.Println(i) 并查看预期值)。所以我希望 goroutine 在创建时捕获i 的值并在以后使用它。
显然不是发生了什么,而是为什么?
【问题讨论】:
标签: go race-condition goroutine