Middle+
Čo sa zobrazí pri spustení programu: func main() { counter := make([]int, 0, 1000) var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() counter = append(counter, i) time.Sleep(10 * time.Millisecond) // Simulácia práce }() } wg.Wait() fmt.Println(len(counter)) }
sobes.tech AI
Odpoveď od AI
Program obsahuje závod s dátami pri zápise do segmentu counter z viacerých gorutín bez synchronizácie. To vedie k nepredvídateľnému správaniu.
Čo sa deje:
- Vytvorí sa segment
counters dĺžkou 0 a kapacitou 1000. - Spustí sa 1000 gorutín, každá sa pokúsi pridať hodnotu
ido segmentu. - Operácia
appendnie je vlákno bezpečná, niekoľko gorutín mení segment súčasne. - Kvôli závodu s dátami môže dôjsť k strate dát, poškodeniu segmentu alebo panike.
Na výstupe:
- Hodnota
len(counter)môže byť menšia ako 1000, pretože niektoré záznamy môžu byť stratené. - Môže dôjsť k panike alebo nesprávnemu výstupu.
Správny prístup je použiť mutex alebo kanál na synchronizáciu prístupu k segmentu:
var mu sync.Mutex
for i := 0; i < 1000; i++ {
wg.Add(1)
go func(val int) {
defer wg.Done()
mu.Lock()
counter = append(counter, val)
mu.Unlock()
time.Sleep(10 * time.Millisecond)
}(i)
}
Alebo použiť vlákno bezpečné dátové štruktúry.