Это вообще не задокументировано в пакете, но обычно атомарные загрузки и сохранения нормальных значений существуют не для атомарности, потому что операции ЦП уже атомарны, а для упорядочения. Спецификация языка или документация по инструкциям ЦП дает вам определенные гарантии того, в каком порядке один ЦП будет видеть другой ЦП, если вы используете атомарные операции. Большинство современных процессоров не имеют таких гарантий, если вы не используете для них правильные (дорогие) инструкции.
Итак, в вашем примере (я предполагаю, поскольку пакет не задокументирован), если общие переменные были записаны горутиной сначала в sharedA
, затем sharedB
, при чтении затем без атомарных операций вы можете увидеть измененное значение sharedB
и все еще старое значение sharedA
. В разных семействах ЦП по-разному, если для сохранения или загрузки требуется дополнительная магия, чтобы правильно упорядочить, поэтому обычно языки заставляют вас использовать атомарные функции как для сохранения, так и для загрузки, а затем компилятор/библиотека знает, что нужно вашему фактическому ЦП.
Конечно, пакет ничего из этого не документирует, так что на практике нет никакой разницы, потому что мы не знаем, что на самом деле гарантирует пакет. Так что для всех практических целей это бесполезно.
person
Art
schedule
05.11.2015