Middle — Middle+
Jak zajistit bezpečnou práci s kolekcí Map v prostředí s více vlákny?
sobes.tech AI
Odpověď od AI
V Go není standardní mapa (mapa) bezpečná pro současné čtení a zápis z různých gorutin. Aby bylo možné bezpečně pracovat s mapou v prostředí s více vlákny, lze použít následující přístupy:
- Synchronizace pomocí mutexu
Použijte sync.Mutex nebo sync.RWMutex k ochraně přístupu k mapě. Při zápisu zamkněte mutex pro zápis, při čtení — pro čtení (pokud používáte RWMutex).
import "sync"
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func (s *SafeMap) Get(key string) (int, bool) {
s.mu.RLock()
defer s.mu.RUnlock()
val, ok := s.m[key]
return val, ok
}
func (s *SafeMap) Set(key string, val int) {
s.mu.Lock()
defer s.mu.Unlock()
s.m[key] = val
}
- Použití sync.Map
V Go existuje specializovaná struktura sync.Map, optimalizovaná pro konkurenční přístup a nevyžadující ruční synchronizaci.
import "sync"
var m sync.Map
// Zápis
m.Store("key", 42)
// Čtení
val, ok := m.Load("key")
- Použití kanálů (channels)
Přístup ke mapě lze organizovat přes gorutinu, která zpracovává požadavky na čtení a zápis přes kanály, čímž zajišťuje sekvenční přístup.
Volba metody závisí na konkrétních požadavcích na výkon a složitost implementace.