Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cetak objek peta apabila ia dikunci oleh mutex

Cetak objek peta apabila ia dikunci oleh mutex

PHPz
PHPzke hadapan
2024-02-10 12:36:09834semak imbas

Cetak objek peta apabila ia dikunci oleh mutex

Editor PHP Xiaoxin di sini untuk memperkenalkan kepada anda petua praktikal tentang kunci mutex: cara mencetak objek peta apabila objek peta dikunci oleh kunci mutex. Mutex ialah mekanisme yang digunakan untuk melindungi sumber yang dikongsi dengan memastikan hanya satu utas boleh mengakses sumber terkunci pada masa yang sama. Dalam artikel ini, kami akan meneroka cara menggunakan kunci mutex untuk melindungi objek peta dan mencetak kandungan peta apabila objek dikunci untuk lebih memahami penggunaan kunci mutex dan akses kepada objek peta.

Kandungan soalan

Saya tidak pasti mengapa mutex tidak berfungsi seperti yang saya jangkakan. Sebarang cadangan akan membantu saya.

Ini kod saya.

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

Apabila saya menjalankan ini, saya mendapat output yang pelik.

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]

Saya menjangka dapat melihat dalam beberapa log a meningkat kepada 1,2,3,4

Apabila saya mengalih keluar inc komen dalam fungsi; Saya dapat melihat log yang dijangkakan.

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]

Penyelesaian

Dalam gelung ini:

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 berjalan di luar mutex. Dua goroutin cuba menambah "a" serentak, salah satu daripadanya menambah dan kemudian menunggu. Apabila fungsi kenaikan itu kembali, fungsi kedua masuk dan bertambah, kemudian println dalam fungsi pertama berjalan, dan kemudian println dalam fungsi kedua mencetak perkara yang sama.

Jadi mutex berfungsi seperti yang diharapkan, tetapi anda mencetak di luar kawasan yang dilindungi oleh mutex.

Atas ialah kandungan terperinci Cetak objek peta apabila ia dikunci oleh mutex. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam