Являются ли чтения и записи для uint8 в golang атомарными?


Как и в заголовке, являются ли операции чтения и записи относительно uint8 атомарными? Логически это должна быть одна команда процессора, очевидно, для чтения и записи для 8-битной переменной. Но в любом случае, два ядра могли бы одновременно читать и записывать из памяти, возможно ли создать устаревшие данные таким образом?

2 3

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.