Penyegerakan Salah dalam Go Lang
Dokumen model memori Go menerangkan bahawa kod berikut mungkin mengakibatkan pencetakan g 2 dan kemudian 0:
var a, b int
func f() {
a = 1
b = 2
}
func g() {
print(b)
print(a)
}
func main() {
go f()
g()
}
Salin selepas log masuk
Penjelasan:
- Pembolehubah a dan b dimulakan kepada nilai sifarnya (0) sebelum sebarang fungsi dilaksanakan.
- Peraturan The Happens Before dalam model memori Go membenarkan penyusun dan pemproses untuk menyusun semula operasi dalam satu goroutine jika penyusunan semula tidak menjejaskan tingkah lakunya.
- Dalam fungsi f(), penetapan kepada a dan b mungkin tidak berlaku dalam susunan yang ditentukan jika penyusunan semula tidak membuat perbezaan dalam goroutine itu.
- Memandangkan tugasan tidak mempunyai kesan dalam fungsi f(), pengkompil boleh menyusun semula tugasan tersebut atas sebab kecekapan.
- Memandangkan tiada penyegerakan antara dua goroutin (iaitu, f() dan g()) dalam contoh yang disediakan, pengkompil tidak cuba memastikan konsistensi antara mereka.
- Walau bagaimanapun, jika anda memperkenalkan penyegerakan antara goroutin, pengkompil akan menjamin bahawa pada titik penyegerakan, kedua-dua tugasan akan "selesai." Ini bermakna bahawa nilai yang betul (2 dan 1) akan dicetak dalam g().
Atas ialah kandungan terperinci Why Might Go\'s `go f(); g()` Cetak \'20\' Daripada \'21\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!