Middle — Middle+
Как да реализираме синхронизацията на елементите на свързан списък, за да осигурим безопасност при многопоточна работа?
sobes.tech AI
Отговор от AI
За да осигурите потокобезопасност при работа с свързан списък в Go, е необходимо да синхронизирате достъпа до неговите елементи, за да избегнете състезателни условия.
Основни подходи:
- Използване на мьютекс (
sync.Mutexилиsync.RWMutex) за блокиране на операциите за четене и писане. - За висока производителност могат да се използват по-сложни структури, като алгоритми без заключване, но това е по-сложно.
Пример с използване на 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
}
По този начин всички операции, които променят или четат списъка, са защитени с мьютекс, което предотвратява конфликтен едновременен достъп.