Sobes.tech
Junior — Middle

Lehet-e párhuzamosan olvasni adatokat egy szeletből egy programozási nyelvben?

sobes.tech MI

Válasz az MI-től

Go nyelvben a szeletek (slices) olyan referencia típusok, amelyek egy memóriahelyen lévő tömbre mutatnak. A párhuzamos olvasás egy szeletből biztonságos, ha senki sem módosítja a szelet vagy az alap tömb tartalmát. Más szóval, ha több goroutine csak olvas egy közös szeletből írás nélkül, akkor ez nem vezet adatversenyhez.

Azonban, ha legalább egy goroutine módosítja a szelet elemeit, és mások ugyanakkor olvasnak vagy írnak, akkor adatverseny alakul ki, és a viselkedés nem meghatározott.

Biztonságos párhuzamos olvasás példája:

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

Ha egyszerre olvasni és írni kell, akkor szinkronizációs mechanizmusokat (pl. mutex) vagy más biztonsági módszereket kell alkalmazni.