Являются ли чтения и записи для uint8 в golang атомарными?
Как и в заголовке, являются ли операции чтения и записи относительно uint8 атомарными? Логически это должна быть одна команда процессора, очевидно, для чтения и записи для 8-битной переменной. Но в любом случае, два ядра могли бы одновременно читать и записывать из памяти, возможно ли создать устаревшие данные таким образом?
2 ответа:
Нет никакой гарантии, что доступ к собственным типам находится на любой платформе atomic. Вот почему существует
sync/atomic
. См.такжерекомендации в документации по модели памяти .Пример универсального способа атомарной установки значения (Play)
var ax atomic.Value // may be globally accessible x := uint8(5) // set atomically ax.Store(x) x = ax.Load().(uint8)
Вероятно, более эффективное решение для
uint8
(играть):var ax int64 // may be globally accessible x := uint8(5) atomic.StoreInt64(&ax, 10) x = uint8(atomic.LoadInt64(&ax)) fmt.Printf("%T %v\n", x, x)
Нет. Если вы хотите атомарные операции, вы можете использовать
sync/atomic
пакет.Если вы имеете в виду " будут ли 8-битные операции атомарными, даже если я игнорирую модель памяти Go ?", то ответ все равно,
это зависитвероятно, нет.Если аппаратное обеспечение гарантирует атомарность операций чтения / записи, то оно может быть атомарным. Но это все еще не гарантирует согласованность кэша или оптимизацию компилятора от операций переупорядочивания. Вам нужно как-то сериализовать операции, с помощью примитивов Go предоставляет в пакете "atomic", а также с помощью пакета" sync " и каналов для координации между goroutines.