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:
counterbo‘limi 0 uzunlik va 1000 sig‘im bilan yaratiladi.- 1000 ta goroutin ishga tushiriladi, har biri
iqiymatini bo‘limga qo‘shishga harakat qiladi. appendoperatsiyasi 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.