Sobes.tech
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.