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

  1. 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
}
  1. sync.RWMutex — se há muitas operações de leitura e poucas de escrita, pode usar RWMutex para melhorar o desempenho.

  2. Cópia do slice — para evitar condições de corrida, pode trabalhar com cópias do slice, embora nem sempre seja eficiente.

  3. 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.