Rumah > pembangunan bahagian belakang > Golang > Mengapa Perlaksanaan Serentak Go Boleh Membawa kepada Nilai Pembolehubah Tidak Dijangka?

Mengapa Perlaksanaan Serentak Go Boleh Membawa kepada Nilai Pembolehubah Tidak Dijangka?

Mary-Kate Olsen
Lepaskan: 2024-11-26 22:40:14
asal
628 orang telah melayarinya

Why Can Go's Concurrent Execution Lead to Unexpected Variable Values?

Penyegerakan Salah dalam GoLang

Dokumen model memori GoLang menyatakan bahawa kod berikut boleh menghasilkan pencetakan g 2 diikuti dengan 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

Punca Penyegerakan Tidak Betul

Tingkah laku ini timbul daripada asynchronous sifat rutin Go. Sebelum sebarang pelaksanaan fungsi, pembolehubah a dan b dimulakan kepada nilai sifar masing-masing (0). Fungsi f() mengubah suai pembolehubah ini, dan fungsi g() kemudiannya mencetak nilainya.

Dalam goroutine, spesifikasi bahasa memastikan bahawa membaca dan menulis berlaku dalam susunan yang ditentukan oleh atur cara. Walau bagaimanapun, penyusunan semula operasi mungkin berlaku tanpa menjejaskan tingkah laku goroutine, seperti yang berlaku di sini.

Dalam f() goroutine, pengkompil boleh mengoptimumkan dengan menyusun semula tugasan kepada b dan a. Memandangkan goroutine tidak menggunakan pembolehubah ini selepas tugasan, penyusunan semula tidak menjejaskan kelakuannya.

Pertimbangan Penyegerakan

Penyegerakan antara goroutine, sebaliknya, memerlukan ketekalan. Pada titik penyegerakan, pengkompil menjamin bahawa semua tugasan telah disiapkan, memastikan kedua-dua a dan b mempunyai nilai yang ditetapkan pada masa g() goroutine membacanya. Ini memastikan pencetakan yang betul bagi nilai yang diubah suai (2 dan 1).

Atas ialah kandungan terperinci Mengapa Perlaksanaan Serentak Go Boleh Membawa kepada Nilai Pembolehubah Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan