Middle+
Šta će biti prikazano pri pokretanju programa: 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) // Simulacija rada }() } wg.Wait() fmt.Println(len(counter)) }
sobes.tech АИ
Одговор од АИ
Program sadrži trku podataka prilikom upisa u segment counter iz više gorutina bez sinhronizacije. To dovodi do nepredvidivog ponašanja.
Šta se dešava:
- Kreira se segment
countersa dužinom 0 i kapacitetom 1000. - Pokreće se 1000 gorutina, od kojih svaka pokušava da doda vrednost
iu segment. - Operacija
appendnije sigurnа za niti, više gorutina istovremeno modifikuje segment. - Zbog trke podataka, može doći do gubitka podataka, oštećenja segmenta ili panike.
Na izlazu:
- Vrednost
len(counter)može biti manja od 1000, jer neke unose mogu biti izgubljene. - Može doći do panike ili netačnog izlaza.
Pravi pristup je korišćenje mutexa ili kanala za sinhronizaciju pristupa 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)
}
Ili korišćenje thread-safe struktura podataka.