Sobes.tech
Middle+

Mida oodata käivitamisel: 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) // Töö simuleerimine }() } wg.Wait() fmt.Println(len(counter)) }

sobes.tech AI

Vastus AI-lt

Programm sisaldab andmelõksu, kirjutades counter järjese mitme goroutine'i poolt ilma sünkroniseerimiseta. See viib ettearamatule käitumisele.

Mis toimub:

  • Loobub counter järjese pikkusega 0 ja mahutavusega 1000.
  • Käivitatakse 1000 goroutine'i, igaüks püüab lisada väärtuse i järjese.
  • Operatsioon append ei ole niidi-turvaline, mitu goroutine'i muudavad järjese samaaegselt.
  • Andmelõksu tõttu võib tekkida andmekadu, järjese kahjustus või panic.

Lõpptulemus:

  • len(counter) väärtus võib olla väiksem kui 1000, kuna mõned kirjed võivad kaduda.
  • Võib tekkida panic või vale väljund.

Õige lähenemine on kasutada mutexi või kanalit, et sünkroniseerida juurdepääs järjesele:

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

Või kasutada niidi-turvalisi andmestruktuure.