Middle — Middle+
როგორ განვახორციელოთ დაკავშირებული სიის ელემენტების სინქრონიზაცია, რათა უზრუნველვყოთ ნაკადების უსაფრთხოება?
sobes.tech AI
პასუხი AI-სგან
Go-ში დაკავშირებული სიის მუშაობისას, საჭიროა მის ელემენტებზე წვდომის სინქრონიზაცია, რათა თავიდან აიცილოთ შეჯახების მდგომარეობა.
ძირითადი მიდგომები:
- წაკითხვის და დაწერის ოპერაციების დასაკეტად mutex (
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
}
ამ გზით, ყველა ოპერაცია, რომელიც ცვლილებას ან კითხულობს სიას, დაცულია mutex-ით, რაც თავიდან აცილებს ერთდროულ წვდომის კონფლიქტებს.