Golang:如果后面紧跟着"for{}"循环,那么在goroutine中写入变量就没有效果


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秒钟。写入同步/缓存刷新/…的时间不够吗。。。?

感谢您的评论,Cerise。
~ 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。

相关内容

  • 没有找到相关文章

最新更新