2016-01-12 2 views
2

Если у меня есть два потока, одновременно изменяющих строковое поле в структуре, я всегда вижу одну или другую строку, назначенную этому полю, но ничего больше?Является ли переменное назначение атомом в go?

+0

Два goroutines (не резьбы), одновременно изменяющие что-либо, представляют собой гонку данных, и нет никаких доброкачественных гонок данных. Всегда проверяйте свою параллельную кодировку с помощью детектора гонки. – JimB

+0

Я думаю, что лучший способ использовать это - использовать каналы для изменения строки. Попросите goroutine прослушивать канал для изменения, которое вы хотите сделать для строки, и где вы в настоящее время изменяете строку, просто записывайте изменение, которое вы хотите использовать для канала. – Topo

+0

@ Топо: нет, это не «лучший способ». Часто есть очень веские основания для использования мьютексов или атомных операций. – JimB

ответ

6

Нет. Если вам нужны атомные операции, есть sync/atomic.

Go Memory Model будет иметь все связанные детали. В верхней части документа Модель памяти:

программ, которые модифицируют данные, для одновременного доступа нескольких goroutines должен сериализовать такой доступ.

Для сериализации доступа, защиты данных с операциями канала или других примитивов синхронизации, такие как те, в пакетах sync и sync/atomic .

Смежные вопросы