Maison  >  Article  >  développement back-end  >  À quoi sert le verrou de lecture Golang ?

À quoi sert le verrou de lecture Golang ?

(*-*)浩
(*-*)浩original
2019-12-03 13:22:213963parcourir

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.

À quoi sert le verrou de lecture Golang ?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn