Why Might Go\'s `go f(); g()` Cetak \'20\' Daripada \'21\'?

DDD
Lepaskan: 2024-11-23 15:00:17
asal
687 orang telah melayarinya

Why Might Go's `go f(); g()` Print

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!

sumber:php.cn
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