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