Если у меня есть два потока, одновременно изменяющих строковое поле в структуре, я всегда вижу одну или другую строку, назначенную этому полю, но ничего больше?Является ли переменное назначение атомом в go?
2
A
ответ
6
Нет. Если вам нужны атомные операции, есть sync/atomic
.
Go Memory Model будет иметь все связанные детали. В верхней части документа Модель памяти:
программ, которые модифицируют данные, для одновременного доступа нескольких goroutines должен сериализовать такой доступ.
Для сериализации доступа, защиты данных с операциями канала или других примитивов синхронизации, такие как те, в пакетах
sync
иsync/atomic
.
Смежные вопросы
- 1. Является ли Git атомом?
- 2. Является ли модуль Эликсира атомом?
- 3. Является ли python dict.pop атомом?
- 4. Является ли sqlite last_insert_rowid атомом?
- 5. Переменное назначение в Elixir
- 6. Переменное назначение в python
- 7. Переменное назначение в jQuery
- 8. Является ли операция ++ атомом в C#?
- 9. Является ли переменное назначение и чтение атомарной работой?
- 10. Переменное назначение в функции
- 11. Является x86 CMPXCHG атомом?
- 12. Переменное назначение и Unity
- 13. Является ли .Net Lock (контекст) атомом?
- 14. Является ли MySQL Query содержащим подзапрос атомом?
- 15. Является ли MySQL уникальной заменой строк атомом?
- 16. Переменное назначение с заменой
- 17. Groovy: переменное назначение
- 18. Переменное назначение в сборке GAS
- 19. Переменное назначение вне класса определение
- 20. Является ли переменное назначением синхронным в nodejs?
- 21. Переменное назначение, которое обновляет ссылку?
- 22. Является ли лямбда атомом в книге «Маленький интриган»?
- 23. Переменное назначение внутри аргумента функции
- 24. Go: Назначение вложенной структуры
- 25. Является ли Go goroutine сопрограммой?
- 26. Является ли поток данных Google BQ/BT атомом на задание?
- 27. Является ли перемещение файла атомом, если задействовано более одного каталога?
- 28. Проблемы с присваиванием Java. Является ли это атомом?
- 29. Является ли составное назначение безопасным?
- 30. Является ли len() атомом python dict относительно GIL?
Два goroutines (не резьбы), одновременно изменяющие что-либо, представляют собой гонку данных, и нет никаких доброкачественных гонок данных. Всегда проверяйте свою параллельную кодировку с помощью детектора гонки. – JimB
Я думаю, что лучший способ использовать это - использовать каналы для изменения строки. Попросите goroutine прослушивать канал для изменения, которое вы хотите сделать для строки, и где вы в настоящее время изменяете строку, просто записывайте изменение, которое вы хотите использовать для канала. – Topo
@ Топо: нет, это не «лучший способ». Часто есть очень веские основания для использования мьютексов или атомных операций. – JimB