Senior
// все елементи у слайса трябва да са уникални + общо 1000 елемента // програмата не трябва да се блокира излишно заради time.sleep func main() { checkIncrement := map[int]int32{} var data []int for i := 0; i < 1000; i++ { go func() { data = append(data, i) if _, found := checkIncrement[i]; found { fmt.Println(i) panic("дублирано увеличение") } checkIncrement[i] = 1 }() } time.Sleep(2 * time.Second) fmt.Println(len(data)) }
sobes.tech АИ
Одговор од АИ
U prikazanom kodu postoji nekoliko problema:
- Istovremeni pristup slice-u
datai mapicheckIncrementiz više gorutina bez sinhronizacije dovodi do uslova trke. - Korišćenje
time.Sleepza čekanje završetka gorutina nije efikasno i pouzdano.
Da biste to ispravili:
- Koristite mutex (
sync.Mutex) za zaštitu zajedničkih podataka. - Primijenite
sync.WaitGroupza čekanje završetka svih gorutina umestotime.Sleep.
Primer ispravljenog koda:
package main
import (
"fmt"
"sync"
)
func main() {
checkIncrement := make(map[int]struct{})
var data []int
var mu sync.Mutex
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func(val int) {
defer wg.Done()
mu.Lock()
defer mu.Unlock()
if _, found := checkIncrement[val]; found {
panic(fmt.Sprintf("duplikat inkrementa: %d", val))
}
checkIncrement[val] = struct{}{}
data = append(data, val)
}(i)
}
wg.Wait()
fmt.Println("Dužina podataka:", len(data))
}
Na ovaj način garantujemo jedinstvenost elemenata, ispravno dodavanje u slice i izbegavamo korišćenje time.Sleep za čekanje.