Sobes.tech
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-ით, რაც თავიდან აცილებს ერთდროულ წვდომის კონფლიქტებს.