Sobes.tech
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 counter sa dužinom 0 i kapacitetom 1000.
  • Pokreće se 1000 gorutina, od kojih svaka pokušava da doda vrednost i u segment.
  • Operacija append nije 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.