如何在Go中演示内存可见性问题?

时间:2019-01-20 23:42:28

标签: go concurrency memory-model memory-visibility

我正在就Go Memory Model做一个介绍。内存模型说,在一个goroutine中的写入与在另一个goroutine中的读取之间没有先发生的关系,无法保证读者会观察到更改。

为了给观众带来更大的影响,我想向他们展示,而不只是告诉他们如果不同步,可能会发生不好的事情。

当我在机器上运行以下代码(带有3.5GHz双核Intel Core i7的2017 MacBook Pro)时,它成功退出。

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

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

  • 使用不同的编译器设置
  • 使用旧版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)
}

0 个答案:

没有答案