Sobes.tech
Senior

Безопасен ли е конкурентният достъп до слайса? Ще има ли състезателна условие, ако 4 горутини променят всеки своя уникален индекс в слайса?

sobes.tech AI

Отговор от AI

В Go, конкурентният достъп до слайс не е безопасен сам по себе си, тъй като слайсът е структура, съдържаща указател към масив, дължина и капацитет. Въпреки това, ако 4 горутини променят всеки своя уникален индекс в слайса и не променят дължината или капацитета му, няма да има състезателни условия, защото всяка горутина работи с отделен елемент.

Важно е:

  • Слайсът да е предварително заделен с необходимия размер.
  • По време на писане да не се променя структурата на слайса (например, чрез append).

Пример:

s := make([]int, 4)
var wg sync.WaitGroup
wg.Add(4)
for i := 0; i < 4; i++ {
    go func(i int) {
        defer wg.Done()
        s[i] = i * 10
    }(i)
}
wg.Wait()

В този пример няма да има състезателни условия, тъй като всяка горутина пише в уникален индекс.

Ако обаче няколко горутини могат да променят дължината на слайса или да работят с един и същи индекс — необходима е синхронизация.