Я делаю презентацию о Go Memory Model . Модель памяти гласит, что без отношения «до и после» между записью в одной процедуре и чтением в другой, нет никакой гарантии, что читатель увидит изменение.
Чтобы оказать большее влияние на аудиторию, вместо того, чтобы просто сказать им, что плохие вещи могут случиться, если вы не синхронизируете, я бы хотел показать им.
Когда я запускаю приведенный ниже код на своем компьютере (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)
}