Senior
Aké problémy s konkurenčným prístupom vznikajú pri volaní metód Get a Set z rôznych gorutín? Ako ich vyriešiť?
sobes.tech AI
Odpoveď od AI
Keď sú metódy Get a Set volané súčasne z rôznych gorútín, vzniká problém s dátovou súťažou (data race). To sa deje, pretože niekoľko gorútín môže súčasne čítať a meniť zdieľané údaje, čo vedie k nepredvídateľnému správaniu a chybám.
Na riešenie tohto problému v Go sa zvyčajne používajú:
- Mutex (sync.Mutex) — blokuje prístup k údajom počas operácie, zabezpečujúc exkluzívny prístup.
- RWMutex (sync.RWMutex) — umožňuje viacerým gorutínam čítať údaje súčasne, ale blokuje zápis, ak niekto zapisuje.
- Kanály (channels) — na organizáciu sekvenčného prístupu k údajom prostredníctvom odosielania správ.
Príklad s RWMutex:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // čítací zámok
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // zápisový zámok
defer m.mu.Unlock()
m.data[key] = value
}
Tento prístup zabezpečuje, že údaje nebudú poškodené počas súbežného prístupu.