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
countermasīvs ar garumu 0 un ietilpību 1000. - Sākas 1000 gorutīnas, katra mēģina pievienot vērtību
imasīvam. - Operācija
appendnav 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.