Senior
Jaké problémy s konkurenčním přístupem vznikají při volání metod Get a Set z různých gorutin? Jak je řešit?
sobes.tech AI
Odpověď od AI
Když jsou metody Get a Set volány současně z různých gorutin, dochází k problému s datovým závodem (data race). To se stává, protože několik gorutin může současně číst a měnit sdílená data, což vede k nepředvídatelnému chování a chybám.
Pro řešení tohoto problému v Go se obvykle používají:
- Mutex (sync.Mutex) — blokuje přístup k datům během operace, zajišťuje exkluzivní přístup.
- RWMutex (sync.RWMutex) — umožňuje více gorutinám současně číst data, ale blokuje zápis, pokud někdo zapisuje.
- Kanály (channels) — pro organizaci sekvenčního přístupu k datům prostřednictvím přenosu zpráv.
Pří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() // čtecí zámek
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ámek
defer m.mu.Unlock()
m.data[key] = value
}
Tento přístup zajišťuje, že data nebudou poškozena při současném přístupu.