Sobes.tech
Middle+

Ko tiks gaidīt, palaižot programmu: 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) // Darba imitācija }() } wg.Wait() fmt.Println(len(counter)) }

sobes.tech AI

Atbilde no AI

Programma satur datu sacensības, rakstot counter masīvā no vairākām gorutīnām bez sinhronizācijas. Tas noved pie neparedzama uzvedības.

Kas notiek:

  • Tiek izveidots counter masīvs ar garumu 0 un ietilpību 1000.
  • Sākas 1000 gorutīnas, katra mēģina pievienot vērtību i masīvam.
  • Operācija append nav droša vairākām pavedieniem, vairākas gorutīnas vienlaikus maina masīvu.
  • Datu sacensības dēļ var notikt datu zudums, masīva bojājums vai panika.

Rezultātā:

  • len(counter) vērtība var būt mazāka par 1000, jo dažas ieraksti var tikt zaudēti.
  • Var notikt panika vai nepareiza izvade.

Pareizā pieeja ir izmantot mutex vai kanālu, lai sinhronizētu piekļuvi masīvam:

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)
}

Vai izmantot pavedienu drošas datu struktūras.