Rumah >pembangunan bahagian belakang >Golang >Mengapa Nilai Goroutine Saya Tidak Kelihatan kepada Orang Lain?
Isunya bukanlah pengoptimuman oleh pengkompil Go, sebaliknya kekurangan penyegerakan. Tugasan kepada i tidak diikuti oleh sebarang peristiwa penyegerakan, jadi ia tidak dijamin untuk diperhatikan oleh mana-mana goroutine lain. Malah, pengkompil yang agresif mungkin memadamkan keseluruhan penyataan i.
Model Memori Go
Model memori Go menentukan keadaan di mana pembacaan pembolehubah dalam satu goroutine boleh dijamin untuk memerhati nilai yang dihasilkan dengan menulis kepada pembolehubah yang sama dalam goroutine yang berbeza.
Untuk menyerikan akses, lindungi data dengan operasi saluran atau primitif penyegerakan lain seperti yang terdapat dalam penyegerakan dan penyegerakan/pakej atom .
Jika anda mesti membaca seluruh dokumen ini untuk memahami tingkah laku program anda, anda terlalu bijak. Jangan pandai.
Penyegerakan
Dalam contoh berikut, tugasan kepada a tidak diikuti oleh sebarang peristiwa penyegerakan, jadi ia tidak dijamin untuk dipatuhi oleh mana-mana goroutine lain. Malah, pengkompil yang agresif mungkin memadamkan keseluruhan pernyataan go.
<code class="go">var a string func hello() { go func() { a = "hello" }() print(a) }</code>
Contoh berikut menunjukkan cara mensiri akses kepada i menggunakan penyegerakan.Mutex.
<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>
Atas ialah kandungan terperinci Mengapa Nilai Goroutine Saya Tidak Kelihatan kepada Orang Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!