Middle
Ce mutex-uri folosești pentru a asigura siguranța în timpul lucrului cu hărți în Go?
sobes.tech AI
Răspuns de la AI
Pentru a asigura siguranța în lucrul cu accesul non-concurent la structuri de date, inclusiv hărți (map), în Go se utilizează mutexuri din pachetul sync.
sync.Mutex: Mutex de bază pentru excludere mutuală. Este folosit pentru blocarea și deblocarea secțiunilor de cod în care se face citire sau scriere pe hartă.sync.RWMutex: Mutex cu acces partajat (citire) și exclusiv (scriere). Permite mai multor goroutine să citească din hartă simultan, dar doar uneia să scrie. Este ideal pentru scenarii în care citirile sunt mult mai frecvente decât scrierile.
Opțiunea preferată pentru lucrul concurent și sigur cu hărți este sync.RWMutex, deoarece asigură o performanță mai bună în operațiile de citire simultană.
Exemplu de utilizare a sync.RWMutex:
import (
"sync"
)
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func NewSafeMap() *SafeMap {
return &SafeMap{
m: make(map[string]int),
}
}
func (sm *SafeMap) Set(key string, value int) {
sm.mu.Lock() // Blocare pentru scriere
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Blocare pentru citire
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
Există și un tip specializat sync.Map, care este optimizat pentru utilizarea concurentă fără blocare explicită cu mutex în majoritatea cazurilor, dar are anumite limitări și o API diferită. Cu toate acestea, dacă este necesar un control mai flexibil asupra blocărilor sau scenarii de acces specifice, utilizarea sync.RWMutex peste un map standard este o practică comună.