Sobes.tech
Junior — Middle

Cum asigurați accesul sigur la card în mediul multithread?

sobes.tech AI

Răspuns de la AI

În Go, pentru accesul sigur la o hartă (map) într-un mediu multi-thread, este necesar să se utilizeze sincronizarea, deoarece map nu este o structură de date sigură pentru fire. Cel mai comun mod este să folosiți un mutex (sync.Mutex sau sync.RWMutex) pentru a bloca accesul în timpul citirii și scrierii.

Exemplu cu sync.RWMutex:

import (
    "sync"
)

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

func read(key string) int {
    mu.RLock()         // blochează pentru citire
    defer mu.RUnlock()
    return m[key]
}

func write(key string, value int) {
    mu.Lock()          // blochează pentru scriere
    defer mu.Unlock()
    m[key] = value
}

De asemenea, în Go există tipul sync.Map, care implementează o hartă sigură pentru fire cu optimizări pentru operațiuni frecvente de citire. Se poate folosi dacă nu este nevoie de tipizare strictă și se dorește simplitate:

import "sync"

var m sync.Map

m.Store("key", 42)          // scriere
value, ok := m.Load("key")  // citire

Prin urmare, pentru acces sigur la map în mediul multi-thread, folosiți mutexuri sau sync.Map.