Middle — Middle+
Que abordagens podem ser usadas para garantir a segurança de threads ao trabalhar com slices em um ambiente multithread?
sobes.tech IA
Resposta da IA
Em Go, os slices não são seguros para acesso concorrente por padrão, portanto, ao trabalhar com eles em um ambiente multithread, é necessário aplicar sincronização.
Principais abordagens:
- Mutex (sync.Mutex) — a forma mais comum. Envolva as operações de leitura e escrita em blocos com mutex para evitar condições de corrida.
var mu sync.Mutex
var s []int
func appendValue(v int) {
mu.Lock()
s = append(s, v)
mu.Unlock()
}
func readSlice() []int {
mu.Lock()
defer mu.Unlock()
return append([]int(nil), s...) // cópia do slice
}
-
sync.RWMutex — se há muitas operações de leitura e poucas de escrita, pode usar RWMutex para melhorar o desempenho.
-
Cópia do slice — para evitar condições de corrida, pode trabalhar com cópias do slice, embora nem sempre seja eficiente.
-
Canais (channels) — pode organizar o acesso ao slice através de uma goroutine gerenciadora, que recebe comandos por canal e modifica o slice, garantindo acesso sequencial.
type command struct {
op string
val int
resp chan []int
}
func sliceManager(cmds chan command) {
var s []int
for cmd := range cmds {
switch cmd.op {
case "append":
s = append(s, cmd.val)
case "read":
cmd.resp <- append([]int(nil), s...)
}
}
}
A escolha da abordagem depende dos requisitos específicos de desempenho e complexidade do código.