Middle — Middle+
Ako implementovať synchronizáciu prvkov prepojenej zoznamu na zabezpečenie bezpečnosti vlákien?
sobes.tech AI
Odpoveď od AI
Pre zabezpečenia bezpečnosti pri práci s prepojeným zoznamom v Go je potrebné synchronizovať prístup k jeho prvkom, aby nedochádzalo ku stavu závodu.
Hlavné prístupy:
- Použitie mutexu (
sync.Mutexalebosync.RWMutex) na zamknutie operácií čítania a zápisu. - Pre vysoký výkon môžu byť použité zložitejšie štruktúry, ako algoritmy bez zámku, ale to je zložitejšie.
Príklad s použitím 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
}
Takto sú všetky operácie, ktoré menia alebo čítajú zoznam, chránené mutexom, čo zabraňuje konfliktom pri súčasnom prístupe.