Middle — Middle+
¿Cómo implementar la sincronización de elementos en una lista enlazada para garantizar la seguridad en entornos multihilo?
sobes.tech AI
Respuesta de la IA
Для обеспечения потокобезопасности при работе со связанным списком в Go необходимо синхронизировать доступ к его элементам, чтобы избежать состояния гонки.
Основные подходы:
- Использование мьютекса (
sync.Mutexилиsync.RWMutex) для блокировки операций чтения и записи. - При необходимости высокой производительности можно использовать более сложные структуры, например, lock-free алгоритмы, но это сложнее.
Пример с использованием 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
}
Таким образом, все операции, изменяющие или читающие список, защищены мьютексом, что предотвращает одновременный конфликтный доступ.