Sobes.tech
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 counter s dĺžkou 0 a kapacitou 1000.
  • Spustí sa 1000 gorutín, každá sa pokúsi pridať hodnotu i do segmentu.
  • Operácia append nie 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.