Sobes.tech
Назад к вопросам
Middle — Middle+
78

Как реализовать синхронизацию элементов связанного списка для обеспечения потокобезопасности?

Ответ от нейросети

sobes.tech AI

Для обеспечения потокобезопасности при работе со связанным списком в Go необходимо синхронизировать доступ к его элементам, чтобы избежать состояния гонки.

Основные подходы:

  • Использование мьютекса (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
}

Таким образом, все операции, изменяющие или читающие список, защищены мьютексом, что предотвращает одновременный конфликтный доступ.