感谢您的评论,Cerise。
package main
import (
"fmt"
"time"
)
func main() {
var x = 0
go func() {
x = 1
for {
}
}()
time.Sleep(5000 * time.Millisecond)
fmt.Printf("%d", x)
}
为什么上面的代码打印0
?
如果在for{}
之前或中添加任何内容,例如runtime.Gosched()
、print(x)
,它将按预期打印1
。
它是否与写障碍/以前发生过有关,或者?我完全糊涂了。
在打印值之前,我让其他goroutine休眠了5秒钟。写入同步/缓存刷新/…的时间不够吗。。。?
~ go tool compile -S main.go
...
"".main.func1 STEXT nosplit size=3 args=0x0 locals=0x0 funcid=0x0
0x0000 00000 (main.go:10) TEXT "".main.func1(SB), NOSPLIT|NEEDCTXT|ABIInternal, $0-0
0x0000 00000 (main.go:10) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (main.go:10) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (main.go:12) XCHGL AX, AX
0x0001 00001 (main.go:1) JMP 0
0x0000 90 eb fd
看起来golang编译器确实删除了程序集中的x = 1
语句(应该是main.go:11
(。
在编程时,我们真的需要记住Go Memory Model和Happens Before。