Junior — Middle
Este posibil să se efectueze citirea concurentă a unui slice într-un limbaj de programare?
sobes.tech AI
Răspuns de la AI
În Go, slice-urile sunt tipuri de referință care indică către un array în memorie. Citirea concurentă a unui slice este sigură dacă nimeni nu modifică conținutul slice-ului sau al array-ului de bază. Adică, dacă mai multe goroutines citesc doar date din același slice fără a scrie, acest lucru nu va duce la condiții de cursă.
Totuși, dacă cel puțin o goroutine modifică elementele slice-ului, iar altele citesc sau scriu în același timp, apare o condiție de cursă și comportamentul nu este definit.
Exemplu de citire concurentă sigură:
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()
Dacă trebuie să citești și să scrii în același timp, trebuie să folosești mecanisme de sincronizare (de exemplu, mutex) sau alte mecanisme de siguranță.