Sobes.tech
Middle — Middle+

Əlaqəli siyahının elementlərinin sinxronizasiyasını necə həyata keçirmək və bu, çox iş parçacığı təhlükəsizliyini necə təmin edir?

sobes.tech Süni İntellekt

AI-dan cavab

Go-da əlaqəli siyahı ilə işləyərkən, yarış vəziyyətlərinin qarşısını almaq üçün onun elementlərinə giriş sinxronlaşdırılmalıdır.

Əsas yanaşmalar:

  • Oxuma və yazma əməliyyatlarını kilidləmək üçün mutex (sync.Mutex və ya sync.RWMutex) istifadə etmək.
  • Yüksək performans üçün, lock-free alqoritmlər kimi daha mürəkkəb strukturlar istifadə oluna bilər, amma bu daha çətindir.

sync.Mutex istifadə edən nümunə:

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
}

Beləliklə, siyahını dəyişdirən və ya oxuyan bütün əməliyyatlar mutex ilə qorunur, bu da eyni vaxtda girişin qarşısını alır.