Maison >développement back-end >Golang >Imprimer l'objet cartographique lorsqu'il est verrouillé par mutex

Imprimer l'objet cartographique lorsqu'il est verrouillé par mutex

PHPz
PHPzavant
2024-02-10 12:36:09891parcourir

Imprimer lobjet cartographique lorsquil est verrouillé par mutex

L'éditeur php Xiaoxin est là pour vous présenter une astuce pratique sur les verrous mutex : comment imprimer l'objet cartographique lorsque l'objet cartographique est verrouillé par le verrou mutex. Un mutex est un mécanisme utilisé pour protéger les ressources partagées en garantissant qu'un seul thread à la fois peut accéder à la ressource verrouillée. Dans cet article, nous explorerons comment utiliser un verrou mutex pour protéger un objet cartographique et imprimer le contenu de la carte lorsque l'objet est verrouillé afin de mieux comprendre l'utilisation des verrous mutex et l'accès aux objets cartographiques.

Contenu de la question

Je ne sais pas pourquoi les mutex ne fonctionnent pas comme prévu. Toutes les suggestions me seront utiles.

Voici mon 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)
}

Quand j'exécute ceci, j'obtiens un résultat étrange.

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]

Je m'attends à voir dans certains journaux a augmenté à 1,2,3,4

Quand je supprime le commentaire inc dans la fonction ; Je peux voir les journaux attendus.

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]

Solution

Dans cette boucle :

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

println s'exécute en dehors du mutex. Deux goroutines tentent d'incrémenter "a" simultanément, l'une d'elles incrémente puis attend. Lorsque cette fonction d'incrémentation revient, la deuxième fonction entre et incrémente, puis le println de la première fonction s'exécute, puis le println de la deuxième fonction imprime la même chose.

Le mutex fonctionne donc comme prévu, mais vous imprimez en dehors de la zone protégée par le mutex.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer