Sobes.tech
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:

  • counter seqmenti uzunluğu 0 və tutumu 1000 olan yaradılır.
  • 1000 goroutin işə salınır, hər biri i də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.