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
Mary-Kate Olsenasal
2024-11-26 22:40:14616semak imbas

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()
}

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:
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