Назад к вопросам
СБЕР
Junior — Middle
81
Каким образом можно безопасно писать в один и тот же Map из нескольких горутин без использования блокировок типа Mutex?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В Go для безопасной записи в общий Map из нескольких горутин без использования Mutex можно применять специализированные структуры или подходы, обеспечивающие потокобезопасность.
Основные варианты:
- Использование sync.Map — встроенная потокобезопасная реализация Map в пакете sync.
var m sync.Map
// Запись
m.Store("key", "value")
// Чтение
value, ok := m.Load("key")
- Использование каналов (channels) для последовательного доступа к Map через отдельную горутину-менеджер.
type request struct {
key string
val string
done chan bool
}
func mapManager(reqCh <-chan request) {
m := make(map[string]string)
for req := range reqCh {
m[req.key] = req.val
req.done <- true
}
}
// В других горутинах отправляем запросы на запись через канал
Таким образом, избегается использование блокировок, а доступ к Map сериализуется через канал.
- Использование атомарных операций и копирования — подходит для специфических случаев, но обычно сложнее.
Рекомендуется использовать sync.Map для простоты и эффективности, если нет особых требований к структуре данных.