登录
首页 >  Golang >  Go问答

Golang:在 Goroutine 中执行带有“for{}”循环的写入操作不会影响其他变量

来源:stackoverflow

时间:2024-02-17 12:12:26 360浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《Golang:在 Goroutine 中执行带有“for{}”循环的写入操作不会影响其他变量》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

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


正确答案


感谢您拨打 comment,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)。

我们在编程时确实需要牢记 The Go Memory ModelHappens Before

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>