Все обращения к общей map нужно согласовать одним mutex либо передать владение map одной горутине. Защищать только запись недостаточно.
Устранение гонки при одновремённом доступе к map
Все обращения к общей map нужно согласовать одним mutex либо передать владение map одной горутине. Защищать только запись недостаточно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо избавиться от состояния гонки, которое возникает, когда несколько горутин одновременно читают и пишут в структуру map.
Устранить состояние гонки при одновременном чтении и записи в map из разных горутин.
Ответ
Все обращения к общей map нужно согласовать одним mutex либо передать владение map одной горутине. Защищать только запись недостаточно.
Пример обёртки с блокировкой на весь доступ:
import "sync"
type Store struct {
mu sync.RWMutex
data map[string]int
}
func (s *Store) Set(key string, value int) {
s.mu.Lock()
defer s.mu.Unlock()
if s.data == nil { s.data = make(map[string]int) }
s.data[key] = value
}
func (s *Store) Get(key string) (int, bool) {
s.mu.RLock()
defer s.mu.RUnlock()
value, ok := s.data[key]
return value, ok
}
Store нельзя копировать после начала использования. Операция «прочитать, изменить, записать» должна выполняться под одной эксклюзивной блокировкой; два отдельных безопасных метода не делают её атомарной.