Sobes.tech
Junior — Middle

Може ли да се извършва конкурентно четене на срез в език за програмиране?

sobes.tech AI

Отговор от AI

В Go, срезовете (slices) са референтни типове, които сочат към масив в паметта. Паралелното четене от срез е безопасно, ако никой не променя съдържанието на среза или базовия масив. Тоест, ако няколко горутини само четат данни от един и същи срез без писане, това няма да доведе до състезателни условия.

Обаче, ако поне една горутина променя елементите на среза, а други четат или пишат едновременно, възниква състезателна условие и поведението не е дефинирано.

Пример за безопасно паралелно четене:

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

Ако трябва да четете и пишете едновременно, трябва да използвате механизми за синхронизация (например mutex) или други механизми за безопасност.