《 Go in action》关于比赛条件的样本:
var (
counter int
wg sync.WaitGroup
)
func main() {
wg.Add(2)
go incCounter(1)
go incCounter(2)
wg.Wait()
fmt.Println("Final Counter:", counter)
}
func incCounter(id int) {
defer wg.Done()
for count := 0; count < 2; count++ {
value := counter
//1 fmt.Println("value=",value)
runtime.Gosched()
value++
counter = value
//2 fmt.Println("counter=",counter)
}
}
据说最终计数器的末尾应为2,解释如下:“每个goroutine都会覆盖另一个工作。这在goroutine交换发生时会发生。每个goroutine都会制作自己的counter变量副本,然后进行交换当该goroutine有时间再次执行时,counter变量的值已更改,但goroutine不会更新其副本,而是继续增加其拥有的副本并将其值重新设置为计数器变量,替换了其他goroutine执行的工作。”
我想这是环境原因,我的机器输出4为1.10.3 + win10。我想知道自本书发行以来发生了什么变化?如果我取消注释1,则最终计数器将打印2;如果我取消注释2,则将随机打印2。为什么?
长风秋雁
相关分类