Безопасность назначения Голанга с единственным читателем и единственным автором - PullRequest
0 голосов
/ 01 июля 2019

Скажем, у меня есть две процедуры:

var sequence int64

// writer
for i := sequence; i < max; i++ {
  doSomethingWithSequence(i)
  sequence = i
}

// reader
for {
  doSomeOtherThingWithSequence(sequence)
}

Так я могу обойтись без atomic?

Некоторые потенциальные риски, о которых я могу думать:

  1. изменение порядка (для автора, обновление sequence происходит раньше, чем doSomething) может произойти, но я могу жить с этим.

  2. sequence неправильно выровнен в памяти, поэтому читатель может наблюдать частично обновленный i. Запуск на (недавнем ядре) linux с x86_64, мы можем исключить это?

  3. go компилятор «ловко оптимизирует» читатель, поэтому доступ к i никогда не идет в память, кроме cached в регистре. Это возможно в ходу?

  4. Что-нибудь еще?

1 Ответ

0 голосов
/ 01 июля 2019

Девиз Go: Не общайтесь, разделяя память; вместо этого делитесь памятью, общаясь . Что является эффективной передовой практикой в ​​большинстве случаев.

  1. Если вы заботитесь о заказе, вам нужно синхронизировать две программы.
  2. Я не думаю, что они возможны. В любом случае, это не то, о чем вам следует беспокоиться, если вы правильно спроектировали синхронизацию.
  3. То же, что и выше.

К счастью, в Go встроен детектор гонки данных . Попробуйте запустить ваш пример с go run -race. Вероятно, вы увидите состояние гонки в переменной sequence.

...