Sobes.tech
Назад к вопросам
Senior
5

Является ли конкурентный доступ к слайсу безопасным? Будет ли race condition, если 4 горутины изменяют каждая свой уникальный индекс слайса?

Компании, где спрашивали
VK CloudVK Cloud

Ответ от нейросети

sobes.tech AI

В Go конкурентный доступ к слайсу не является безопасным сам по себе, так как слайс — это структура, содержащая указатель на массив, длину и емкость. Однако, если 4 горутины изменяют каждый свой уникальный индекс слайса и при этом не изменяют длину или емкость слайса, то гонки данных (race condition) не будет, потому что каждая горутина работает с отдельным элементом.

Важно, чтобы:

  • Слайс был заранее выделен нужного размера.
  • Не происходило изменение структуры слайса (например, 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()

В этом примере гонок не будет, так как каждая горутина пишет в уникальный индекс.

Если же несколько горутин могут менять длину слайса или работать с одним и тем же индексом — нужна синхронизация.