gpt4 book ai didi

go - 为什么这个例子可能不退出?

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:28 24 4
gpt4 key购买 nike

<分区>

这是来自 Go 文档的 "The Go Memory Model" 的示例

代码:

var a string
var done bool

func setup() {
a = "hello, world"
done = true
}

func main() {
go setup()
for !done {
}
print(a)
}

文档中的原始句子:

和以前一样,不能保证在 main 中,观察对 done 的写入意味着观察对 a 的写入,因此该程序也可以打印一个空字符串。更糟糕的是,无法保证对 done 的写入会被 main 观察到,因为两个线程之间没有同步事件。不保证 main 中的循环完成。

为什么?

我猜主 goroutine 只是在寄存器中缓存 done=false 变量,没有任何同步操作来刷新寄存器缓存。

谢谢。


编辑 2019-08-16

我想通了。

如果设置了 runtime.GOMAXPROCS(1),那么唯一的线程将始终运行 for !done{}。调度程序没有任何机会将线程上下文切换到 setup() 子程序。所以编译器不能保证这个例子完成。

当我们调用内置库函数时,运行时库将有机会调度 goroutine。例如:

mutex.Lock()
// 1、enter go build-in lib
// 2、switch to other goroutine if sync condition is not satisfied
// 3、condition is satisfied
someAction()
mutex.Unlock()

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com