Sobes.tech
Middle — Middle+

Kuidas rakendada seotud nimekirja elementide sünkroniseerimist, et tagada lõimude turvalisus?

sobes.tech AI

Vastus AI-lt

Selleks, et tagada voogude ohutus, töötades seotud nimekirjaga Go keeles, tuleb sünkroniseerida juurdepääs selle elementidele, et vältida võistlusolukordi.

Peamised lähenemised:

  • Kasutada mutexit (sync.Mutex või sync.RWMutex), et lukustada lugemis- ja kirjutamisoperatsioone.
  • Kõrge jõudluse korral saab kasutada keerukamaid struktuure, näiteks lock-free algoritme, kuid see on keerulisem.

Näide sync.Mutex kasutamisega:

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
}

Nii, kõik toimingud, mis muudavad või loevad nimekirja, on kaitstud mutexiga, mis takistab samaaegset konflikti juurdepääsu.