Sobes.tech
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
}

Այսպիսով՝ բոլոր գործողությունները, որոնք փոփոխում կամ կարդում են ցանկը, պաշտպանված են մուտեքսով, ինչը կանխում է միաժամանակյա հակամարտությունները։