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