Race Conditions in Data Structures
Ma'lumotlar tuzilmalarida poyga holati
Shu kursda yozgan Stack, Queue va boshqa tuzilmalarning barchasida yashirin bir xavf bor: ular faqat bitta goroutine bir vaqtning o'zida ishlatganda to'g'ri ishlaydi. Agar bir nechta goroutine bir xil Stack'ga bir vaqtda Push qilsa, natija oldindan aytib bo'lmaydigan tarzda buziladi.
Buni tasavvur qiling: ikki kishi bir vaqtda bitta daftarga yozmoqchi. Ikkalasi ham "hozir sahifa bo'sh" deb o'ylab, bir xil qatorga yozishni boshlaydi — natijada bittasining yozuvi ikkinchisiniki ustidan bosilib, yo'qolib ketadi. Dasturda ham xuddi shunday: ikkita goroutine bir vaqtda s.items = append(s.items, v) qatorini bajarsa, ikkalasi ham "eski" s.itemsni o'qib, ikkalasi ham o'zining yangi versiyasini yozib qo'yishi mumkin — natijada bittasining yozgani yo'qolib ketadi.
Bu hodisa race condition (poyga holati) deyiladi — chunki natija qaysi goroutine "tezroq yetib borishiga" bog'liq bo'lib qoladi, va bu tasodifiy, oldindan bilib bo'lmaydigan. Bu — "Concurrency Fundamentals" kursida ko'rgan sync.Mutex va kanallarning aynan nima uchun kerakligini eslatuvchi holat.
Goroutine A: items = [1, 2] ni o'qiydi
Goroutine B: items = [1, 2] ni o'qiydi (A hali yozib ulgurmagan)
Goroutine A: items = [1, 2, 3] deb yozadi
Goroutine B: items = [1, 2, 4] deb yozadi (A'ning yozgani YO'QOLDI!)
Natija: items = [1, 2, 4] — lekin kutilgan natija [1, 2, 3, 4] ediEng yomon tomoni — bunday xatolar ba'zan ko'rinadi, ba'zida yo'q: agar goroutinelar "baxtli" tartibda ishlasa, hech qanday muammo sezilmaydi, va xato faqat production'da, ko'p yuk ostida, kutilmagan vaqtda paydo bo'ladi. Keyingi ikkita darsda buni qanday hal qilishni ko'ramiz.
Key Takeaway
Key Takeaway:
Oddiy (himoyasiz) ma'lumotlar tuzilmasiga bir nechta goroutine bir vaqtda yozsa, "poyga holati" (race condition) yuzaga keladi — natija tasodifiy va noto'g'ri bo'lib qoladi, chunki bir goroutine yozgani boshqasiniki ustidan bosilib ketishi mumkin.
NEXT UP
Mutex-Protected Containers