Sobes.tech
Middle — Middle+

Ako implementovať synchronizáciu prvkov prepojenej zoznamu na zabezpečenie bezpečnosti vlákien?

sobes.tech AI

Odpoveď od AI

Pre zabezpečenia bezpečnosti pri práci s prepojeným zoznamom v Go je potrebné synchronizovať prístup k jeho prvkom, aby nedochádzalo ku stavu závodu.

Hlavné prístupy:

  • Použitie mutexu (sync.Mutex alebo sync.RWMutex) na zamknutie operácií čítania a zápisu.
  • Pre vysoký výkon môžu byť použité zložitejšie štruktúry, ako algoritmy bez zámku, ale to je zložitejšie.

Príklad s použitím 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
}

Takto sú všetky operácie, ktoré menia alebo čítajú zoznam, chránené mutexom, čo zabraňuje konfliktom pri súčasnom prístupe.