Middle+
Proqram işə salındıqda nə göstəriləcək: 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) // İşin təqlidi }() } wg.Wait() fmt.Println(len(counter)) }
sobes.tech Süni İntellekt
AI-dan cavab
Proqram counter seqmentinə çox sayda goroutinadan sinxronizasiya olmadan yazılarkən məlumat yarışı baş verir. Bu, proqnozlaşdırılmayan davranışlara səbəb olur.
Nə baş verir:
counterseqmenti uzunluğu 0 və tutumu 1000 olan yaradılır.- 1000 goroutin işə salınır, hər biri
idəyərini seqmentə əlavə etməyə çalışır. appendəməliyyatı çox ipli təhlükəsiz deyil, bir neçə goroutin eyni zamanda seqmenti dəyişir.- Məlumat yarışı səbəbindən məlumat itkisi, seqmentin pozulması və ya panika baş verə bilər.
Nəticədə:
len(counter)dəyəri 1000-dən kiçik ola bilər, çünki bəzi qeydlər itə bilər.- Panika və ya yanlış çıxış baş verə bilər.
Düzgün yanaşma mutex və ya kanal istifadə edərək seqmentə girişin sinxronlaşdırılmasıdır:
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)
}
Yaxud çox ipli təhlükəsiz məlumat strukturlarından istifadə edin.