Sobes.tech
Junior — Middle

Dasturlash tilida kesimdan ma'lumotlarni raqobatli o'qish mumkinmi?

sobes.tech AI

AIdan javob

Go tilida, kesmalar (slices) xotirada joylashgan massivga ishora qiluvchi referens turidir. Kesmani bir vaqtning o'zida o'qish xavfsiz bo'lsa, agar hech kim kesma yoki asosiy massiv mazmunini o'zgartirmasa. Ya'ni, agar bir nechta goroutinlar faqat bir xil kesmadan ma'lumot o'qiyotgan bo'lsa va yozmayotgan bo'lsa, bu holat data race'ga olib kelmaydi.

Ammo, agar kamida bitta goroutine kesma elementlarini o'zgartirsa va boshqalar bir vaqtning o'zida o'qiy yoki yozayotgan bo'lsa, data race yuzaga keladi va xulosa belgilangan emas.

Xavfsiz bir vaqtning o'zida o'qish misoli:

slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
wg.Add(2)
go func() {
    defer wg.Done()
    fmt.Println(slice[0])
}()
go func() {
    defer wg.Done()
    fmt.Println(slice[1])
}()
wg.Wait()

Agar bir vaqtning o'zida o'qish va yozish kerak bo'lsa, sinxronizatsiya mexanizmlari (masalan, mutex) yoki boshqa xavfsizlik mexanizmlaridan foydalanish tavsiya etiladi.