Kas on võimalik tagada turvalisus Mapist andmete samaaegsel lugemisel mitme niidiga keskkonnas?
sobes.tech AI
Vastus AI-lt
Go-s ei ole standardkaart (map) samaeglas kasutamiseks turvaline. Kui mitu goroutine'i loevad map'ist ilma kirjutamata, on see turvaline. Kuid kui vähemalt üks goroutine kirjutab map'isse, põhjustab samaaegne lugemine ja kirjutamine panic'i.
Turvalise samaaegse lugemise jaoks map'ist ilma kirjutamiseta, saab kasutada tavalist map'i ilma sünkroniseerimiseta. Kuid kui kirjutamise võimalus on olemas, tuleb kasutada sünkroniseerimist, näiteks sync.RWMutex või sync.Map, mis on spetsiaalselt loodud konkurentsivõimelise juurdepääsu jaoks.
Näide sync.RWMutex-iga turvalisest lugemisest ja kirjutamisest:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// Kirjutamine
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// Lugemine
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Kui garantite, et map ei muutu pärast initsialiseerimist, siis samaaegne lugemine on turvaline ilma täiendava sünkroniseerimiseta.