Скажем, у меня есть две процедуры:
var sequence int64
// writer
for i := sequence; i < max; i++ {
doSomethingWithSequence(i)
sequence = i
}
// reader
for {
doSomeOtherThingWithSequence(sequence)
}
Так я могу обойтись без atomic
?
Некоторые потенциальные риски, о которых я могу думать:
изменение порядка (для автора, обновление sequence
происходит раньше, чем doSomething
) может произойти, но я могу жить с этим.
sequence
неправильно выровнен в памяти, поэтому читатель может наблюдать частично обновленный i
. Запуск на (недавнем ядре) linux с x86_64,
мы можем исключить это?
go компилятор «ловко оптимизирует» читатель, поэтому доступ к i
никогда не идет в память, кроме cached
в регистре. Это возможно в ходу?
Что-нибудь еще?