Sobes.tech
Middle — Middle+

¿Cómo implementar la sincronización de elementos en una lista enlazada para garantizar la seguridad en entornos multihilo?

sobes.tech AI

Respuesta de la IA

Для обеспечения потокобезопасности при работе со связанным списком в 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
}

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