Sobes.tech
Middle — Middle+

Como implementar a sincronização de elementos de uma lista ligada para garantir a segurança de threads?

sobes.tech IA

Resposta da IA

Para garantir a segurança ao trabalhar com listas ligadas em Go, é necessário sincronizar o acesso aos seus elementos para evitar condições de corrida.

Abordagens principais:

  • Uso de mutex (sync.Mutex ou sync.RWMutex) para bloquear operações de leitura e escrita.
  • Para alto desempenho, podem ser usadas estruturas mais complexas, como algoritmos sem bloqueio, mas isso é mais difícil.

Exemplo usando sync.Mutex:

import "sync"

type Node struct {
    value int
    next  *Node
}

type LinkedList struct {
    head *Node
    mu   sync.Mutex
}

func (l *LinkedList) Add(value int) {
    l.mu.Lock()
    defer l.mu.Unlock()
    newNode := &Node{value: value}
    if l.head == nil {
        l.head = newNode
        return
    }
    current := l.head
    for current.next != nil {
        current = current.next
    }
    current.next = newNode
}

func (l *LinkedList) GetAll() []int {
    l.mu.Lock()
    defer l.mu.Unlock()
    var values []int
    current := l.head
    for current != nil {
        values = append(values, current.value)
        current = current.next
    }
    return values
}

Assim, todas as operações que modificam ou leem a lista estão protegidas por um mutex, prevenindo acessos concorrentes conflitantes.