4

我正在做一个关于Go Memory Model的演讲。内存模型表明,如果在一个 goroutine 中的写入和另一个 goroutine 中的读取之间没有发生之前的关系,就无法保证读者会观察到变化。

为了对观众产生更大的影响,而不是仅仅告诉他们如果不同步就会发生坏事,我想向他们展示。

当我在我的机器(2017 MacBook Pro with 3.5GHz dual-core Intel Core i7)上运行以下代码时,它成功退出。

我能做些什么来证明内存可见性问题吗?

例如,我可以对以下值进行任何特定更改以证明该问题:

  • 使用不同的编译器设置
  • 使用旧版本的 Go
  • 在不同的操作系统上运行
  • 在不同的硬件上运行(例如 ARM 或具有多个 NUMA 节点的机器)。

例如,在 Java 中,标志-server-client影响 JVM 进行的优化并导致出现可见性问题。

我知道答案可能是否定的,并且编写规范可能是为了给未来的维护者更多的优化灵活性。我知道我可以通过设置使代码永远不会退出,GOMAXPROCS=1但这并不能证明可见性问题。

package main
var a string
var done bool

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

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

0 回答 0