Sobes.tech
Junior — Middle

Πώς να διασφαλίσετε ασφαλή πρόσβαση στην κάρτα σε ένα πολυνηματικό περιβάλλον;

sobes.tech AI

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

Στη Go, για ασφαλή πρόσβαση σε έναν χάρτη (map) σε ένα περιβάλλον πολλαπλών νημάτων, είναι απαραίτητο να χρησιμοποιήσετε συγχρονισμό, καθώς το map δεν είναι δομή δεδομένων ασφαλής για νήματα. Ο πιο συνηθισμένος τρόπος είναι η χρήση ενός mutex (sync.Mutex ή sync.RWMutex) για το κλείδωμα της πρόσβασης κατά την ανάγνωση και την εγγραφή.

Παράδειγμα με sync.RWMutex:

import (
    "sync"
)

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

func read(key string) int {
    mu.RLock()         // κλειδώνει για ανάγνωση
    defer mu.RUnlock()
    return m[key]
}

func write(key string, value int) {
    mu.Lock()          // κλειδώνει για εγγραφή
    defer mu.Unlock()
    m[key] = value
}

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

import "sync"

var m sync.Map

m.Store("key", 42)          // εγγραφή
value, ok := m.Load("key")  // ανάγνωση

Έτσι, για ασφαλή πρόσβαση σε map σε περιβάλλον πολλαπλών νημάτων, χρησιμοποιήστε mutex ή sync.Map.