Sobes.tech
Middle+

Dastur ishga tushirilganda nima chiqariladi: 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) // Ishni taqlid qilish }() } wg.Wait() fmt.Println(len(counter)) }

sobes.tech AI

AIdan javob

Dastur counter bo‘limiga bir nechta goroutinlar tomonidan sinxronizatsiya qilinmasdan yozish jarayonida ma’lumotlar uchun raqobat yuzaga keladi. Bu oldindan aytib bo‘lmaydigan xatti-harakatlarga olib keladi.

Nima bo‘layapti:

  • counter bo‘limi 0 uzunlik va 1000 sig‘im bilan yaratiladi.
  • 1000 ta goroutin ishga tushiriladi, har biri i qiymatini bo‘limga qo‘shishga harakat qiladi.
  • append operatsiyasi iplararo xavfsiz emas, bir nechta goroutinlar bir vaqtning o‘zida bo‘limni o‘zgartiradi.
  • Ma’lumotlar uchun raqobat natijasida ma’lumotlar yo‘qotilishi, bo‘limning buzilishi yoki panika yuzaga kelishi mumkin.

Natijada:

  • len(counter) qiymati 1000 dan kichik bo‘lishi mumkin, chunki ba’zi yozuvlar yo‘qotilishi mumkin.
  • Panika yoki noto‘g‘ri chiqish yuzaga kelishi mumkin.

To‘g‘ri yondashuv — bo‘limga kirishni sinxronlashtirish uchun mutex yoki kanal ishlatish:

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)
}

Yoki iplararo xavfsiz ma’lumot tuzilmalaridan foydalaning.