Comment utiliser RWMutex dans Golang?

type Stat struct {
    counters     map[string]*int64
    countersLock sync.RWMutex
    averages     map[string]*int64
    averagesLock sync.RWMutex
}

Il est appelé ci-dessous

func (s *Stat) Count(name string) {
    s.countersLock.RLock()
    counter := s.counters[name]
    s.countersLock.RUnlock()
    if counter != nil {
        atomic.AddInt64(counter, int64(1))
        return
    }
}

Ma compréhension est que nous avons d'abord verrouiller le récepteur s (qui est un type de Stat) et puis nous ajoutons à cela si le compteur n'existe pas.

Questions:

Q1: pourquoi avons-nous besoin de le verrouiller? Ce n' RWMutex même dire?

T2: s.countersLock.RLock() - est-ce à verrouiller l'ensemble du récepteur s ou seulement les compteurs champ type de Stat?

T3: s.countersLock.RLock() - est-ce lock-up des moyennes de champ?

Q4: Pourquoi devrions-nous utiliser RWMutex? Je pensais que le canal était la meilleure façon de gérer la simultanéité dans Golang?

Q5: Qu'est-ce atomic.AddInt64. Pourquoi avons-nous besoin atomique dans ce cas?

Q6: Pourquoi serait-on débloquer juste avant de les ajouter au?

InformationsquelleAutor samol | 2013-10-03