En effet, plusieurs goroutines se disputent la même carte. Il existe deux façons de résoudre ce problème, l'une consiste à utiliser sync.Map et l'autre à verrouiller. sync.map est une nouvelle fonctionnalité ajoutée dans go1.9 et ne sera pas abordée ici pour l'instant. De plus, le scénario commercial actuel peut être complètement résolu avec des verrous en lecture-écriture, nous avons donc décidé d'utiliser des verrous en lecture-écriture.
Verrouillage en lecture-écriture
RWMutex est un verrou en lecture-écriture, qui peut ajouter plusieurs verrous en lecture ou un verrou en écriture. Il est souvent utilisé dans des scénarios où le nombre de lectures est bien supérieur au nombre d’écritures. (Apprentissage recommandé : go)
func (rw *RWMutex) Lock() Verrouillage en écriture, s'il y a d'autres verrous en lecture et en écriture avant d'ajouter le verrou en écriture, le verrou bloquera jusqu'à ce que le verrou est disponible. Pour garantir que le verrou est finalement disponible, l'appel de verrouillage bloqué exclura les nouveaux lecteurs du verrou acquis, c'est-à-dire que l'autorisation du verrou en écriture est supérieure au verrou en lecture. Lorsqu'il y a un verrou en écriture, l'écriture est autorisée. le verrouillage est prioritaire
func (rw *RWMutex) Unlock() Déverrouillez le verrouillage en écriture Si le verrouillage en écriture n'est pas effectué, cela provoquera une erreur d'exécution
func (rw *RWMutex) RLock () Verrou de lecture Lorsqu'il y a un verrou en écriture, le verrou en lecture ne peut pas être chargé. Lorsqu'il n'y a qu'un verrou en lecture ou aucun verrou, le verrou en lecture peut être chargé. , il convient donc au scénario de "plus de lecture et moins d'écriture"
func (rw *RWMutex) RUnlock() Déverrouille le verrou de lecture RUnlock annule un seul appel RLock Cela n'a aucun effet. sur d'autres lecteurs qui existent en même temps. Si rw n'est pas verrouillé en lecture, l'appel de RUnlock provoquera une erreur d'exécution
Résumé :
Les verrous de lecture ne peuvent pas bloquer les verrous de lecture
Les verrous de lecture sont nécessaires pour bloquer les verrous en écriture jusqu'à ce que tous les verrous en lecture soient libérés
Les verrous en écriture doivent bloquer les verrous en lecture jusqu'à ce que tous les verrous en écriture soient libérés
Les verrous en écriture doivent bloquer les verrous en écriture
Up code :
type MapWithLock struct { //把读写锁和资源map封装在一起 sync.RWMutex M map[string]Kline } var KlineDataMemory = make(map[string] interface{}) var InstrLock sync.RWMutex var counter = MapWithLock{ // 生成一个带有锁和map的实例,然后就可以使用啦 InstrLock, KlineDataMemory, } . . . counter.RLock() //加读锁 for _, v := range counter.M { instrID = v.InstrumentID break } counter.RUnlock() //解除读锁 加锁和解锁必须成对出现,并且建议放在同一层次的代码块中
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!