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) или други механизми за безопасност.