Junior — Middle
Vai ir iespējams nodrošināt drošību, vienlaikus lasot datus no Map daudzprocesu vidē?
sobes.tech AI
Atbilde no AI
Go standarta karte (map) nav droša vienlaicīgai piekļuvei. Ja vairākas goroutines lasa no map bez rakstīšanas, tas ir droši. Tomēr, ja vismaz viena goroutine raksta map, vienlaicīga lasīšana un rakstīšana izraisīs paniku.
Lai droši vienlaicīgi lasītu no map bez rakstīšanas, var izmantot parastu map bez sinhronizācijas. Bet, ja ir rakstīšanas iespēja, ir jāizmanto sinhronizācija, piemēram, ar sync.RWMutex vai sync.Map, kas ir īpaši izstrādāts konkurējošai piekļuvei.
Piemērs ar sync.RWMutex drošai lasīšanai un rakstīšanai:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// Rakstīšana
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// Lasīšana
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Ja garantējat, ka map pēc inicializācijas nemainīsies, tad vienlaicīga lasīšana ir droša bez papildu sinhronizācijas.