Согласно блогу Go,
Карты небезопасны для одновременного использования: он не определяет, что происходит, когда вы читаете и записываете их одновременно. Если вам нужно читать и записывать на карту из одновременного выполнения goroutines, доступ должен быть опосредован каким-то механизмом синхронизации. (источник: https://blog.golang.org/go-maps-in-action)
Может ли кто-нибудь уточнить это? Параллельные операции чтения кажутся допустимыми во всех подпрограммах, но одновременные операции чтения/записи могут генерировать условие гонки, если вы пытаетесь прочитать и записать на тот же ключ.
Может ли этот последний риск быть уменьшен в некоторых случаях? Например:
- Функция A порождает k и устанавливает m [k] = 0. Это единственный раз, когда A пишет для отображения m. k, как известно, не находится в m.
- A передает k в функцию B, выполняющуюся одновременно
- A затем читает m [k]. Если m [k] == 0, он ждет, продолжая только тогда, когда m [k]!= 0
- B ищет k на карте. Если он найдет это, B устанавливает m [k] на некоторое положительное целое число. Если он не ждет, пока k не будет в m.
Это не код (очевидно), но я думаю, что он показывает контуры случая, когда даже если A и B пытаются получить доступ к m, не будет состояния гонки, или если это не будет иметь значения из-за дополнительных ограничений.