Sobes.tech
Middle — Middle+

Jak zaimplementować synchronizację elementów listy powiązanej w celu zapewnienia bezpieczeństwa wątków?

sobes.tech AI

Odpowiedź od AI

Aby zapewnić bezpieczeństwo podczas pracy z listą powiązaną w Go, konieczne jest zsynchronizowanie dostępu do jej elementów, aby uniknąć warunków wyścigu.

Główne podejścia:

  • Użycie mutexa (sync.Mutex lub sync.RWMutex) do blokowania operacji odczytu i zapisu.
  • W przypadku potrzeby wysokiej wydajności można użyć bardziej złożonych struktur, takich jak algorytmy bez blokad, ale jest to trudniejsze.

Przykład z użyciem 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
}

W ten sposób wszystkie operacje modyfikujące lub odczytujące listę są chronione mutexem, co zapobiega konfliktom dostępu równoczesnego.