Rumah >pembangunan bahagian belakang >Golang >Mengapa Perlaksanaan Serentak Go Boleh Membawa kepada Nilai Pembolehubah Tidak Dijangka?
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() }
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.
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!