Sobes.tech
Middle+

Hogyan védekezzünk a hibák ellen a konkurens írás során egy térképen?

sobes.tech MI

Válasz az MI-től

A versenyhelyzetek elleni védelemhez a map esetében Golangban, amely alapértelmezés szerint nem szálbiztos, a következő mechanizmusokat használják:

  • sync.Mutex: A map zárolása írás előtt és feloldása írás után.

    import "sync"
    
    type SafeMap struct {
        mu sync.Mutex
        data map[string]int
    }
    
    func NewSafeMap() *SafeMap {
        return &SafeMap{
            data: make(map[string]int),
        }
    }
    
    func (sm *SafeMap) Set(key string, value int) {
        sm.mu.Lock()
        defer sm.mu.Unlock()
        sm.data[key] = value
    }
    
    func (sm *SafeMap) Get(key string) (int, bool) {
        sm.mu.Lock()
        defer sm.mu.Unlock()
        val, ok := sm.data[key]
        return val, ok
    }
    
  • sync.RWMutex: Lehetővé teszi több goroutine számára az egyidejű olvasást, de blokkolja az írást az olvasás vagy írás közben.

    import "sync"
    
    type SafeMapRWMutex struct {
        mu sync.RWMutex
        data map[string]int
    }
    
    func NewSafeMapRWMutex() *SafeMapRWMutex {
        return &SafeMapRWMutex{
            data: make(map[string]int),
        }
    }
    
    func (sm *SafeMapRWMutex) Set(key string, value int) {
        sm.mu.Lock() // Írás zárolás
        defer sm.mu.Unlock()
        sm.data[key] = value
    }
    
    func (sm *SafeMapRWMutex) Get(key string) (int, bool) {
        sm.mu.RLock() // Olvasási zárolás
        defer sm.mu.RUnlock()
        val, ok := sm.data[key]
        return val, ok
    }
    
  • sync.Map: Speciális, szálbiztos típus, optimalizált olyan forgatókönyvekre, ahol a kulcsok halmaza viszonylag stabil, és a bejegyzések ritkák, vagy amikor több goroutine olvas és ír különálló kulcshalmazokon.

    import "sync"
    
    var safeMap sync.Map // Deklaráció
    
    func UseSyncMap() {
        safeMap.Store("key1", 10) // Írás
        if val, ok := safeMap.Load("key1"); ok { // Olvasás
            // Használja a val értéket
        }
        safeMap.Delete("key1") // Törlés
    }
    

Összehasonlítás:

Mechanizmus Előnyök Hátrányok Alkalmazás
sync.Mutex Egyszerű használat Minden műveletet blokkol íráskor Egyszerű forgatókönyvek, ahol a verseny nem magas vagy az olvasás/írás egyenértékű.
sync.RWMutex Lehetővé teszi párhuzamos olvasást Bonyolultabb, mint a sync.Mutex. Az írás blokkolja az olvasást és más írásokat. Gyakori olvasás és ritka írás esetén.
sync.Map Optimalizált bizonyos forgatókönyvekre Korlátozott API. Lehet, hogy lassabb, mint a Mutex, ha a hozzáférés teljesen véletlenszerű. Olyan forgatókönyvekben, ahol a kulcsok viszonylag stabilak vagy diszjunkt halmazokat használnak külön goroutine-ok között.

A konkrét megközelítés kiválasztása a hozzáférés jellemzőitől függ. Általános esetekben gyakran elegendő a sync.Mutex vagy a sync.RWMutex. Speciális forgatókönyvekhez a sync.Map jobb teljesítményt nyújthat.