Sobes.tech
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ță.