环境:go1.7.3 win7 64bit
代码1的执行结果是隔一秒只打印0,不符合预期
0
0
0
...
把代码1改成代码2,结果就对了
353036023
713389754
1073135313
...
这是个什么情况,有大佬知道吗
代码1:
package main
import (
"fmt"
"time"
)
func main() {
i := 0
go func () {
for true {
//隔一秒打印i
time.Sleep(1000000000)
fmt.Println(i)
}
}()
for true {
i++
}
}
代码2:
package main
import (
"fmt"
"time"
)
func main() {
i := 0
go func () {
for true {
i++
}
}()
for true {
//隔一秒打印i
time.Sleep(1000000000)
fmt.Println(i)
}
}
有疑问加站长微信联系(非本文作者)

这个问题在我电脑上,两种情况打印出的结果都是 0。 环境:go version go1.12 linux/amd64
真奇怪,我记得上午我测试的时结果是不一样的。然后刚才我又测试了一下,怎么结果都是0了?题主确定结果不一样?
上面的截图不好看代码,我发这里,你可以自己研究一下
生成汇编代码,用 go tool compile -S go文件
Golang大佬Ross Cox说了:“Don’t communicate by sharing memory. (Especially without any synchronization.)。” 具体原因请看“https://golang.org/ref/mem”。楼上汇编分析有道理。
当data race存在时,程序运行的行为是不确定的,所以这样的代码没有实际意义
我后面用ubuntu go 1.10试了下,也都是0
对的,后面我在两个循环里面都打印i,结果就不是0了
如果你在循环都加了打印,是有区别的,编译器会插入调度代码。
这个网页我打不开, 我是初学,各种想法都想试下,以后会避开这个坑
我觉得不是data race的问题,应该是编译器优化的问题
初学go,不太懂go的编译优化策略,谢谢你的方法
复制粘贴链接