Как продемонстрировать проблемы видимости памяти в 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)
}

0 ответов

Другие вопросы по тегам