Sobes.tech
Senior

Je konkurenčný prístup ku slice bezpečný? Bude dôjsť k race condition, ak 4 goroutines menia každý svoj jedinečný index v slice?

sobes.tech AI

Odpoveď od AI

V jazyku Go nie je súbežný prístup k slice bezpečný sám o sebe, pretože slice je štruktúra obsahujúca ukazovateľ na pole, dĺžku a kapacitu. Ak však 4 gorutiny menia každý svoj unikátny index v slice a pritom nemenia dĺžku alebo kapacitu, nedôjde ku stavu závodu, pretože každá gorutina pracuje s oddeleným prvkom.

Dôležité je, aby:

  • Slice bol vopred alokovaný požadovanej veľkosti.
  • Počas zápisu nedochádzalo k zmene štruktúry slice (napríklad pomocou append).

Príklad:

s := make([]int, 4)
var wg sync.WaitGroup
wg.Add(4)
for i := 0; i < 4; i++ {
    go func(i int) {
        defer wg.Done()
        s[i] = i * 10
    }(i)
}
wg.Wait()

V tomto príklade ku stavu závodu nedôjde, pretože každá gorutina zapisuje do unikátneho indexu.

Ak však viac gorutín môže meniť dĺžku slice alebo pracovať so rovnakým indexom — je potrebná synchronizácia.