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.
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]
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!