Назад к вопросам
VK Cloud
Senior
5
Является ли конкурентный доступ к слайсу безопасным? Будет ли race condition, если 4 горутины изменяют каждая свой уникальный индекс слайса?
Компании, где спрашивали
Ответ от нейросети
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()
В этом примере гонок не будет, так как каждая горутина пишет в уникальный индекс.
Если же несколько горутин могут менять длину слайса или работать с одним и тем же индексом — нужна синхронизация.