Sobes.tech
Middle — Middle+

Как да реализираме синхронизацията на елементите на свързан списък, за да осигурим безопасност при многопоточна работа?

sobes.tech AI

Отговор от AI

За да осигурите потокобезопасност при работа с свързан списък в Go, е необходимо да синхронизирате достъпа до неговите елементи, за да избегнете състезателни условия.

Основни подходи:

  • Използване на мьютекс (sync.Mutex или sync.RWMutex) за блокиране на операциите за четене и писане.
  • За висока производителност могат да се използват по-сложни структури, като алгоритми без заключване, но това е по-сложно.

Пример с използване на 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
}

По този начин всички операции, които променят или четат списъка, са защитени с мьютекс, което предотвратява конфликтен едновременен достъп.