Sobes.tech
Junior — Middle

Kas on võimalik teha konkurentsivõimelist andmete lugemist lõigust programmeerimiskeeles?

sobes.tech AI

Vastus AI-lt

Go keeles on lõigud (slices) viite tüübid, mis viitavad mälus asuvale massiivile. Paralleelne lugemine lõigust on ohutu, kui keegi ei muuda lõigu või selle alusmassivi sisu. Teisisõnu, kui mitu goroutine'i ainult loevad andmeid ühest lõigust ilma kirjutamata, siis see ei põhjusta andmevõistlusi.

Kuid, kui vähemalt üks goroutine muudab lõigu elemente ja teised loevad või kirjutavad samaaegselt, tekib võistlusolukord ja käitumine on määratlemata.

Ohutu paralleelne lugemine näide:

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

Kui on vaja samaaegselt lugeda ja kirjutada, tuleb kasutada sünkroniseerimismehhanisme (näiteks mutex) või muid turvamehhanisme.