Heim > Backend-Entwicklung > Golang > Kartenobjekt drucken, wenn es durch Mutex gesperrt ist

Kartenobjekt drucken, wenn es durch Mutex gesperrt ist

PHPz
Freigeben: 2024-02-10 12:36:09
nach vorne
860 Leute haben es durchsucht

Kartenobjekt drucken, wenn es durch Mutex gesperrt ist

Der PHP-Editor Xiaoxin ist hier, um Ihnen einen praktischen Tipp zu Mutex-Sperren vorzustellen: So drucken Sie das Kartenobjekt, wenn das Kartenobjekt durch die Mutex-Sperre gesperrt ist. Ein Mutex ist ein Mechanismus zum Schutz gemeinsam genutzter Ressourcen, indem sichergestellt wird, dass jeweils nur ein Thread auf die gesperrte Ressource zugreifen kann. In diesem Artikel erfahren Sie, wie Sie mit einer Mutex-Sperre ein Kartenobjekt schützen und den Karteninhalt ausdrucken, wenn das Objekt gesperrt ist, um die Verwendung von Mutex-Sperren und den Zugriff auf Kartenobjekte besser zu verstehen.

Frageninhalt

Ich bin mir nicht sicher, warum Mutexe nicht wie erwartet funktionieren. Alle Vorschläge werden mir hilfreich sein.

Das ist mein Code.

package main

import (
    "fmt"
    "sync"
    "time"
)

type container struct {
    mu       sync.mutex
    counters map[string]int
}

func (c *container) inc(name string) {
    c.mu.lock()
    defer c.mu.unlock()
    c.counters[name]++
    
    // fmt.println("in", name, c.counters) 
    // this print is doing tricks between goroutines
    time.sleep(time.second)
}

func main() {
    c := container{

        counters: map[string]int{"a": 0, "b": 0},
    }

    var wg sync.waitgroup

    doincrement := func(name string, n int) {
        for i := 0; i < n; i++ {
            c.inc(name)
            fmt.println(name, c.counters)
        }
        wg.done()
    }

    wg.add(3)
    go doincrement("a", 2)
    go doincrement("b", 2)
    go doincrement("a", 2)

    wg.wait()
    fmt.println(c.counters)
}
Nach dem Login kopieren

Wenn ich das ausführe, erhalte ich eine seltsame Ausgabe.

a map[a:2 b:0]
a map[a:2 b:0]
b map[a:2 b:1]
a map[a:4 b:1]
a map[a:4 b:1]
b map[a:4 b:2]
map[a:4 b:2]
Nach dem Login kopieren

Ich erwarte in einigen Protokollen einen Anstieg a auf 1,2,3,4

Wenn ich den inc-Kommentar in der Funktion entferne; Ich kann die erwarteten Protokolle sehen.

in a map[a:1 b:0]
a map[a:1 b:0]
in a map[a:2 b:0]
a map[a:2 b:0]
in b map[a:2 b:1]
b map[a:2 b:1]
in a map[a:3 b:1]
a map[a:3 b:1]
in a map[a:4 b:1]
a map[a:4 b:1]
in b map[a:4 b:2]
b map[a:4 b:2]
map[a:4 b:2]
Nach dem Login kopieren

Lösung

In dieser Schleife:

for i := 0; i < n; i++ {
            c.inc(name)  ---> This runs with mutex locked
            fmt.Println(name, c.counters)  --> This runs with mutex unlocked
}
Nach dem Login kopieren

println läuft außerhalb des Mutex. Zwei Goroutinen versuchen gleichzeitig, „a“ zu erhöhen, eine von ihnen erhöht und wartet dann. Wenn diese Inkrementierungsfunktion zurückkehrt, kommt die zweite Funktion und inkrementiert, dann wird println in der ersten Funktion ausgeführt, und dann druckt println in der zweiten Funktion dasselbe.

Der Mutex funktioniert also wie erwartet, aber Sie drucken außerhalb des durch den Mutex geschützten Bereichs.

Das obige ist der detaillierte Inhalt vonKartenobjekt drucken, wenn es durch Mutex gesperrt ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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