Когда и зачем использовать пакет atomi c go, сравните с =, + - PullRequest
0 голосов
/ 18 июня 2020

Как go документ освещен:

Операция добавления, реализованная функциями AddT, является atomi c эквивалентом:

* addr + = delta

return * addr

Операции загрузки и сохранения, реализованные функциями LoadT и StoreT, являются atomi c эквивалентами "return * addr" и "* addr = val" .

Вот мой вопрос:

Почему я должен использовать 'atomi c .AddT' вместо '+'?

Почему 'atomi c .LoadT 'not' = '?

Это не' = 'и' + 'aomi c?

Может ли кто-нибудь привести мне пример, показывающий различия между ними?

Ответы [ 3 ]

2 голосов
/ 18 июня 2020

Во-первых, вам нужно знать о модели памяти go:

https://golang.org/ref/mem

Ключевым моментом для понимания является то, что эффекты записи переменных в горутине не обязательно видимы для другой горутины так же, как горутина наблюдает за ними. То есть, если горутина записывает значение в переменную a, а затем в другую переменную b, другая горутина может видеть эти записи в неопределенном порядке. Вот почему вам нужны параллельные примитивы, такие как каналы или мьютексы. Все, что произошло до операции канала или операции мьютекса, будет видно для всех горутин в этот момент. Операции

Atomi c предоставляют аналогичные гарантии, хотя модель памяти явно не указывает это.

Нелегко писать код с использованием атомики. Вы должны рассмотреть все возможные чередования выполнения, чтобы убедиться, что нет гонок. Придерживайтесь каналов и мьютексов. Правильный код лучше, чем быстрый, но пикантный код.

0 голосов
/ 18 июня 2020

Вам просто не следует использовать пакет atomi c at all .

Как четко указано в документации пакета

Package atomi c предоставляет низкоуровневые примитивы памяти atomi c, полезные для реализации алгоритмов синхронизации.

Эти функции требуют большой осторожности для правильного использования. За исключением специальных низкоуровневых приложений, синхронизацию лучше выполнять с помощью каналов или средств пакета syn c. Делитесь памятью, общаясь; не общайтесь, разделяя память.

Он предназначен только для экспертов.

Вы спросили: «Разве это не '=' и '+' aomi c?» Нет! Ничто (!) В Go не является atomi c, кроме примитивов в пакете atomi c (отсюда и название), того, что пакет syn c предоставляет, и операций с каналами.

Так что нет, вы нельзя использовать =, +, -, /, и т.д. c. работают одновременно. И вы буквально никогда не должны писать код, который предполагает, что что-то правильное как atomi c. Всегда обеспечивайте корректную синхронизацию (через пакет syn c) или через каналы.

0 голосов
/ 18 июня 2020

Представьте, есть 5 горутин, которые одновременно обращаются к одной и той же памяти / источнику, инициализированному 0, и пытаются увеличить его. Обычная операция приращения «+» приведет к гонке данных, поскольку нет гарантии правильного обновления состояния из-за одновременных операций. В конце концов, нет никакой гарантии, что значение общей переменной равно 5

Операции Atomi c помогают в этом случае, поскольку они блокируют память для безопасных операций с помощью горутин, и, следовательно, не наблюдается гонок данных

Вы также можете использовать каналы или мьютексы для блокировки состояния и безопасной работы, что более рекомендуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...