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.