Sobes.tech
Junior — Middle

Lze bezpečně používat sdílené zdroje jako Map při současném přístupu z více gorutin?

sobes.tech AI

Odpověď od AI

Ne, standardní mapa (map) v Go není vlákny bezpečná a nemůže být současně používána z více gorutin bez dodatečné synchronizace. Bez ochrany může dojít k závodům a panice.

Pro bezpečné používání sdílených zdrojů typu mapy v vícevláknovém prostředí lze:

  • Použít sync.Mutex nebo sync.RWMutex k ochraně přístupu k mapě.
  • Použít sync.Map, specializovanou a vlákny bezpečnou datovou strukturu pro mapy.

Příklad s mutexem:

var mu sync.Mutex
var m = make(map[string]int)

func write(key string, value int) {
    mu.Lock()
    m[key] = value
    mu.Unlock()
}

func read(key string) int {
    mu.Lock()
    defer mu.Unlock()
    return m[key]
}

Použití sync.Map:

var m sync.Map

m.Store("key", 42)
value, ok := m.Load("key")