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

Cetak objek peta apabila ia dikunci oleh mutex

PHPz
Lepaskan: 2024-02-10 12:36:09
ke hadapan
863 orang telah melayarinya

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)
}
Salin selepas log masuk

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]
Salin selepas log masuk

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]
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan