Sobes.tech
Senior

Jaké problémy s konkurenčním přístupem vznikají při volání metod Get a Set z různých gorutin? Jak je řešit?

sobes.tech AI

Odpověď od AI

Když jsou metody Get a Set volány současně z různých gorutin, dochází k problému s datovým závodem (data race). To se stává, protože několik gorutin může současně číst a měnit sdílená data, což vede k nepředvídatelnému chování a chybám.

Pro řešení tohoto problému v Go se obvykle používají:

  • Mutex (sync.Mutex) — blokuje přístup k datům během operace, zajišťuje exkluzivní přístup.
  • RWMutex (sync.RWMutex) — umožňuje více gorutinám současně číst data, ale blokuje zápis, pokud někdo zapisuje.
  • Kanály (channels) — pro organizaci sekvenčního přístupu k datům prostřednictvím přenosu zpráv.

Příklad s RWMutex:

import "sync"

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

func (m *SafeMap) Get(key string) (string, bool) {
    m.mu.RLock()         // čtecí zámek
    defer m.mu.RUnlock()
    val, ok := m.data[key]
    return val, ok
}

func (m *SafeMap) Set(key, value string) {
    m.mu.Lock()          // zápisový zámek
    defer m.mu.Unlock()
    m.data[key] = value
}

Tento přístup zajišťuje, že data nebudou poškozena při současném přístupu.