Rumah >pembangunan bahagian belakang >Golang >Mengapa Goroutine Saya Menambah Pembolehubah Menghasilkan Keputusan Yang Tidak Dijangka?
Dalam coretan kod ini, goroutine dilancarkan dan berulang kali menambah pembolehubah i:
<code class="go">package main import "time" func main() { i := 1 go func() { for { i++ } }() <-time.After(1 * time.Second) println(i) }</code>
Walau bagaimanapun, output sentiasa 1. Tingkah laku ini boleh dikaitkan dengan model memori Go dan pelaksanaan khusus kod ini.
Model memori Go mentakrifkan syarat di mana bacaan pembolehubah dalam satu goroutine boleh dijamin untuk memerhatikan nilai yang dihasilkan dengan menulis kepada pembolehubah yang sama dalam goroutine yang berbeza. Ia menekankan kepentingan penyegerakan untuk akses serentak kepada data yang dikongsi.
Dalam kod yang diberikan:
Pengkompil yang agresif mungkin memadamkan pernyataan i, dengan berkesan mengurangkan goroutine kepada:
<code class="go">for {}</code>
Untuk menunjukkan bahawa isu itu berpunca daripada kekurangan penyegerakan, pertimbangkan kod berikut:
<code class="go">package main import ( "sync" "time" ) func main() { mx := new(sync.Mutex) i := 1 go func() { for { mx.Lock() i++ mx.Unlock() } }() <-time.After(1 * time.Second) mx.Lock() println(i) mx.Unlock() }</code>
Dalam kes ini, output bukan lagi 1, tetapi jumlah yang besar, seperti yang dijangkakan. Penyegerakan.Mutex menyediakan penyegerakan dan memastikan kedua-dua goroutine mengakses i secara terkawal, membenarkan goroutine menambah i dan membuat perubahan kelihatan kepada rutin utama.
Atas ialah kandungan terperinci Mengapa Goroutine Saya Menambah Pembolehubah Menghasilkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!