Sobes.tech
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.