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
counterjärjese pikkusega 0 ja mahutavusega 1000. - Käivitatakse 1000 goroutine'i, igaüks püüab lisada väärtuse
ijärjese. - Operatsioon
appendei 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.