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, αποτρέποντας ταυτόχρονες συγκρούσεις πρόσβασης.