Sobes.tech
Middle — Middle+

Πώς υλοποιείτε τον συγχρονισμό των στοιχείων μιας συνδεδεμένης λίστας για να διασφαλίσετε την ασφάλεια των νημάτων;

sobes.tech AI

Απάντηση από AI

Για να διασφαλίσετε την ασφάλεια ροής κατά την εργασία με μια συνδεδεμένη λίστα σε Go, πρέπει να συγχρονίσετε την πρόσβαση στα στοιχεία της, ώστε να αποφευχθούν καταστάσεις αγώνα.

Βασικές προσεγγίσεις:

  • Χρήση mutex (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
}

Έτσι, όλες οι λειτουργίες που τροποποιούν ή διαβάζουν τη λίστα προστατεύονται από mutex, αποτρέποντας ταυτόχρονες συγκρούσεις πρόσβασης.