Senior
O acesso concorrente a um slice é seguro? Haverá condição de corrida se 4 goroutines modificarem cada uma seu índice único do slice?
sobes.tech IA
Resposta da IA
Em Go, o acesso concorrente a um slice não é seguro por si só, pois um slice é uma estrutura que contém um ponteiro para um array, um comprimento e uma capacidade. No entanto, se 4 goroutines modificarem cada uma seu índice único do slice e não alterarem o comprimento ou a capacidade do slice, não haverá condições de corrida, pois cada goroutine trabalha com um elemento separado.
É importante que:
- O slice seja pré-alocado com o tamanho necessário.
- Não haja alteração na estrutura do slice (por exemplo, com append) durante a escrita.
Exemplo:
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()
Neste exemplo, não haverá condições de corrida, pois cada goroutine escreve em um índice único.
Se várias goroutines podem alterar o comprimento do slice ou trabalhar com o mesmo índice, é necessária sincronização.