Maison > développement back-end > Golang > le corps du texte

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

PHPz
Libérer: 2024-02-10 12:36:09
avant
855 Les gens l'ont consulté

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)
}
Copier après la connexion

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]
Copier après la connexion

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]
Copier après la connexion

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
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal