Middle+
157
questionbank
Как объединить по смыслу карты (map) и мьютексы (mutex)?
Ответ от нейросети
sobes.tech AI
Для создания конкурентно-безопасной карты.
При одновременном доступе нескольких горутин к map могут возникнуть гонки данных. Мьютекс, или RWMutex для более тонкого контроля, используется для синхронизации доступа. Перед чтением или записью данных в карту накладывается блокировка, а после операции она снимается.
Пример с sync.RWMutex:
package main
import (
"sync"
)
// SafeMap - конкурентно-безопасная карта
type SafeMap struct {
mu sync.RWMutex // мьютекс для защиты карты
m map[string]string // сама карта
}
// NewSafeMap - создает новый экземпляр SafeMap
func NewSafeMap() *SafeMap {
return &SafeMap{
m: make(map[string]string),
}
}
// Set - записывает значение в карту с блокировкой на запись
func (sm *SafeMap) Set(key, value string) {
sm.mu.Lock() // блокировка на запись
defer sm.mu.Unlock() // снятие блокировки после завершения функции
sm.m[key] = value
}
// Get - читает значение из карты с блокировкой на чтение
func (sm *SafeMap) Get(key string) (string, bool) {
sm.mu.RLock() // блокировка на чтение (позволяет множественным горутинам читать одновременно)
defer sm.mu.RUnlock() // снятие блокировки
val, ok := sm.m[key]
return val, ok
}
// Delete - удаляет элемент из карты с блокировкой на запись
func (sm *SafeMap) Delete(key string) {
sm.mu.Lock() // блокировка на запись
defer sm.mu.Unlock() // снятие блокировки
delete(sm.m, key)
}
Таким образом, мьютекс оборачивает доступ к карте, гарантируя, что в любой момент времени только одна горутина может изменять карту (с использованием Lock/Unlock) или множество горутин могут одновременно читать ее (с использованием RLock/RUnlock для RWMutex).