Как продемонстрировать проблемы видимости памяти в Go?
Я делаю презентацию о модели памяти Go. Модель памяти гласит, что без отношения "до и после" между записью в одной процедуре и чтением в другой, нет никакой гарантии, что читатель увидит это изменение.
Чтобы оказать большее влияние на аудиторию, вместо того, чтобы просто сказать им, что плохие вещи могут случиться, если вы не синхронизируете их, я бы хотел их показать.
Когда я запускаю приведенный ниже код на своем компьютере (MacBook Pro 2017 года с двухъядерным процессором Intel Core i7 3,5 ГГц), он успешно завершается.
Что я могу сделать, чтобы продемонстрировать проблемы с видимостью памяти?
Например, есть ли какие-то конкретные изменения в следующих значениях, которые я мог бы внести, чтобы продемонстрировать проблему:
- использовать разные настройки компилятора
- использовать старую версию 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)
}