Sobes.tech
Junior — Middle

Jak zapewnić bezpieczny dostęp do karty w środowisku wielowątkowym?

sobes.tech AI

Odpowiedź od AI

W Go, aby bezpiecznie uzyskać dostęp do mapy (map) w środowisku wielowątkowym, konieczne jest użycie synchronizacji, ponieważ map nie jest strukturą danych bezpieczną dla wątków. Najczęstszym sposobem jest użycie mutexa (sync.Mutex lub sync.RWMutex) do blokowania dostępu podczas odczytu i zapisu.

Przykład z użyciem sync.RWMutex:

import (
    "sync"
)

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

func read(key string) int {
    mu.RLock()         // blokuje do odczytu
    defer mu.RUnlock()
    return m[key]
}

func write(key string, value int) {
    mu.Lock()          // blokuje do zapisu
    defer mu.Unlock()
    m[key] = value
}

W Go dostępny jest również typ sync.Map, który implementuje bezpieczną dla wątków mapę z optymalizacjami dla częstych operacji odczytu. Można go używać, jeśli nie potrzebujesz ścisłej typizacji i chcesz prostoty:

import "sync"

var m sync.Map

m.Store("key", 42)          // zapis
value, ok := m.Load("key")  // odczyt

W ten sposób, aby bezpiecznie uzyskać dostęp do mapy w środowisku wielowątkowym, używaj mutexów lub sync.Map.