Sobes.tech
Senior

Jakie problemy z dostępem współbieżnym występują podczas wywoływania metod Get i Set z różnych gorutyn? Jak je rozwiązać?

sobes.tech AI

Odpowiedź od AI

Gdy wywołujesz jednocześnie metody Get i Set z różnych gorutyn, pojawia się problem wyścigu danych (data race). Dzieje się tak, ponieważ wiele gorutyn może jednocześnie odczytywać i modyfikować wspólne dane, co prowadzi do nieprzewidywalnego zachowania i błędów.

Aby rozwiązać ten problem w Go, zazwyczaj używa się:

  • Mutex (sync.Mutex) — blokuje dostęp do danych na czas operacji, zapewniając wyłączny dostęp.
  • RWMutex (sync.RWMutex) — pozwala wielu gorutynom jednocześnie odczytywać dane, ale blokuje zapis, jeśli ktoś inny zapisuje.
  • Kanały (channels) — do organizacji sekwencyjnego dostępu do danych poprzez przesyłanie wiadomości.

Przykład z użyciem RWMutex:

import "sync"

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

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

func (m *SafeMap) Set(key, value string) {
    m.mu.Lock()          // blokada zapisu
    defer m.mu.Unlock()
    m.data[key] = value
}

Ten podejście gwarantuje, że dane nie zostaną uszkodzone podczas dostępu współbieżnego.