Heim >Backend-Entwicklung >Golang >Wozu dient die Golang-Lesesperre?

Wozu dient die Golang-Lesesperre?

(*-*)浩
(*-*)浩Original
2019-12-03 13:22:214035Durchsuche

Dies liegt daran, dass mehrere Goroutinen um dieselbe Karte konkurrieren. Es gibt zwei Möglichkeiten, dieses Problem zu lösen: Eine besteht darin, sync.Map zu verwenden, und die andere darin, zu sperren. sync.map ist eine neue Funktion, die in go1.9 hinzugefügt wurde und hier vorerst nicht besprochen wird. Darüber hinaus kann das aktuelle Geschäftsszenario vollständig mit Lese-/Schreibsperren gelöst werden, daher haben wir uns für die Verwendung von Lese-/Schreibsperren entschieden.

Wozu dient die Golang-Lesesperre?

Lese-/Schreibsperre

RWMutex ist eine Lese-/Schreibsperre, die mehrere Lesesperren oder eine Schreibsperre hinzufügen kann. Es wird häufig in Szenarien verwendet, in denen die Anzahl der Lesevorgänge viel größer ist als die Anzahl der Schreibvorgänge. (Empfohlenes Lernen: go)

func (rw *RWMutex) Lock() Schreibsperre. Wenn vor dem Hinzufügen der Schreibsperre andere Lese- und Schreibsperren vorhanden sind, wird die Sperre blockiert bis Um sicherzustellen, dass die Sperre schließlich verfügbar ist, schließt der blockierte Sperraufruf neue Leser von der erworbenen Sperre aus, d. h. die Schreibsperre ist höher als die Lesesperre Sperre erhält Priorität

func (rw *RWMutex) Unlock() Entsperren Sie die Schreibsperre. Wenn die Schreibsperre nicht ausgeführt wird, führt dies zu einem Laufzeitfehler

func (rw *RWMutex) RLock () Lesesperre kann nicht geladen werden. Wenn nur eine Lesesperre vorhanden ist, können mehrere Lesesperren geladen werden , also für das Szenario „mehr Lesen und weniger Schreiben“ geeignet

func (rw *RWMutex) RUnlock hebt die Lesesperre auf. Es hat keine Wirkung auf anderen Lesern, die gleichzeitig existieren. Wenn rw nicht zum Lesen gesperrt ist, führt der Aufruf von RUnlock zu einem Laufzeitfehler

Zusammenfassung:

Lesesperren können Lesesperren nicht blockieren

Lesesperren erforderlich um Schreibsperren zu blockieren, bis alle Lesesperren aufgehoben sind

Schreibsperren müssen Lesesperren blockieren, bis alle Schreibsperren aufgehoben sind

Schreibsperren müssen Schreibsperren blockieren

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()   //解除读锁    加锁和解锁必须成对出现,并且建议放在同一层次的代码块中

Das obige ist der detaillierte Inhalt vonWozu dient die Golang-Lesesperre?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn