Sobes.tech
Middle — Middle+

Come garantire un lavoro sicuro con la collezione Map in un ambiente multithread?

sobes.tech AI

Risposta dell'AI

In Go, la mappa standard (map) non è sicura per l'accesso concorrente in lettura e scrittura da diverse goroutine. Per garantire un uso sicuro della mappa in un ambiente multithread, si possono usare i seguenti approcci:

  1. Sincronizzazione con mutex

Utilizzare sync.Mutex o sync.RWMutex per proteggere l'accesso alla mappa. Durante la scrittura, bloccare il mutex per la scrittura, e durante la lettura — per la lettura (se si usa RWMutex).

import "sync"

type SafeMap struct {
    mu sync.RWMutex
    m  map[string]int
}

func (s *SafeMap) Get(key string) (int, bool) {
    s.mu.RLock()
    defer s.mu.RUnlock()
    val, ok := s.m[key]
    return val, ok
}

func (s *SafeMap) Set(key string, val int) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.m[key] = val
}
  1. Utilizzo di sync.Map

In Go, esiste una struttura specializzata sync.Map, ottimizzata per accesso concorrente e che non richiede sincronizzazione manuale.

import "sync"

var m sync.Map

// Scrittura
m.Store("key", 42)

// Lettura
val, ok := m.Load("key")
  1. Utilizzo di canali (channels)

Si può organizzare l'accesso alla mappa tramite una goroutine che gestisce le richieste di lettura e scrittura tramite canali, garantendo un accesso sequenziale.

La scelta del metodo dipende dai requisiti specifici di prestazioni e complessità di implementazione.