Heim > Backend-Entwicklung > Golang > Sperren Sie die Karte für den gleichzeitigen Zugriff auf die Karte

Sperren Sie die Karte für den gleichzeitigen Zugriff auf die Karte

WBOY
Freigeben: 2024-02-09 11:06:09
nach vorne
1103 Leute haben es durchsucht

Sperren Sie die Karte für den gleichzeitigen Zugriff auf die Karte

php-Editor Baicao ist hier, um Ihnen eine sehr nützliche Technik vorzustellen, die darin besteht, die Karte für den gleichzeitigen Zugriff zu sperren. Diese Technik kann Entwicklern helfen, Konflikte und Datenfehler beim gleichzeitigen Zugriff auf die Karte zu vermeiden. Durch die Verwendung eines Sperrmechanismus können Entwickler sicherstellen, dass jede Anfrage in der richtigen Reihenfolge erfolgt und kein Datenchaos entsteht. Dies ist für die Entwicklung von Kartenoperationen sehr wichtig, insbesondere wenn mehrere Benutzer gleichzeitig auf die Karte zugreifen. Werfen wir einen Blick darauf, wie man diese Technik umsetzt!

Frageninhalt

Ich habe eine Karte: map[string]map[string]*Struct und ich muss sie in mehreren Go-Routinen lesen/schreiben.

Was ist der beste Weg, dies zu erreichen? Mutex oder RWMutex? Und wo soll es platziert werden?

Wenn ich RWMutex verwende, sollte ich vor dem Ausführen von Lese- und Schreibvorgängen sperren oder sperren?

Ich habe versucht, rwmutex in der Root-Map zu verwenden, bin mir aber nicht sicher, ob dies der beste Weg ist, dieses Problem zu lösen.

Ich habe auch versucht, vor dem Lesen und Schreiben zu „sperren“, aber manchmal bekomme ich „gleichzeitige Schreibvorgänge“-Panik.

Workaround

Sie können RWLock verwenden. Wenn der Vorgang das Schreiben beinhaltet (unabhängig davon, ob es sich um ein Lesen oder nur um ein Schreiben handelt), müssen Sie Lock verwenden. Wenn es sich nur um einen Lesevorgang handelt, müssen Sie RLock/RUnlock verwenden.

Schloss kann auch als exklusives Schloss betrachtet werden. RLock hingegen ist nicht exklusiv. Ein RLock kann auch dann erworben werden, wenn der RWMutex zum Lesen gesperrt ist, aber die Goroutine-Ausführung wird blockiert, wenn die Ressource ausschließlich durch die Lock-Methode gesperrt ist:

a blocked Lock call excludes new readers from acquiring the lock
Nach dem Login kopieren

Andererseits blockiert die Lock-Methode die Ausführung von Goroutinen, bis alle Leser und Autoren die Ressource entsperren (mithilfe der RUnlock/Unlock-Methode). Lock ist exklusiv, da nur eine Goroutine auf die Ressource zugreifen kann (ob lesend oder schreibend), bis die Unlock-Methode aufgerufen wird.

Typische Methode:

package main

import (
    "fmt"
    "sync"
)

type SomeStruct struct {
    someInfo string
}

type ConcurrentStruct struct {
    mu   sync.RWMutex
    data map[string]map[string]*SomeStruct
}

func New() *ConcurrentStruct {
    return &ConcurrentStruct{
        data: make(map[string]map[string]*SomeStruct),
    }
}

func (cs *ConcurrentStruct) Set(key1, key2 string, val SomeStruct) {
    cs.mu.Lock()
    defer cs.mu.Unlock()

    if _, ok := cs.data[key1]; !ok {
        cs.data[key1] = make(map[string]*SomeStruct)
    }
    cs.data[key1][key2] = &val
}

func (cs *ConcurrentStruct) Get(key1, key2 string) (val *SomeStruct, ok bool) {
    cs.mu.RLock()
    defer cs.mu.RUnlock()

    if _, ok := cs.data[key1]; ok {
        val, ok := cs.data[key1][key2]
        return val, ok
    }

    return nil, false
}

func main() {
    cs := New()
    cs.Set("a", "b", SomeStruct{"Hello, World!"})

    if _, ok := cs.Get("a", "c"); !ok {
        fmt.Printf("key1=a, key2=c, not found\n")
    }

    if s, ok := cs.Get("a", "b"); ok {
        fmt.Printf("key1=a, key2=b, found: %v\n", s)
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSperren Sie die Karte für den gleichzeitigen Zugriff auf die Karte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage