Middle — Middle+
Ինչպե՞ս իրականացնել կապված ցանկի տարրերի սինխրոնիզացիան՝ ապահովելու համար թրեդների անվտանգությունը։
sobes.tech AI
Պատասխան AI-ից
Go-ում կապված ցանկով աշխատելիս, անհրաժեշտ է մուտեքսը (sync.Mutex կամ sync.RWMutex) օգտագործել՝ հասանելիությունը սինխրոնիզացնելու համար՝ ռեսուրսների մրցակցության կանխարգելման համար:
Հիմնական մոտեցումները՝
- Կարդալու և գրելու գործողությունները փակելու համար մուտեքսի օգտագործում՝
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
}
Այսպիսով՝ բոլոր գործողությունները, որոնք փոփոխում կամ կարդում են ցանկը, պաշտպանված են մուտեքսով, ինչը կանխում է միաժամանակյա հակամարտությունները։