Как продемонстрировать проблемы видимости памяти в Go? - PullRequest
0 голосов
/ 21 января 2019

Я делаю презентацию о 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...