Isu Pergi Rutin: Penyegerakan Tidak Betul
Isu yang anda hadapi dalam GoLang berpunca daripada model ingatannya. Mengikut dokumentasi, dalam satu goroutine, membaca dan menulis boleh disusun semula selagi ia tidak menjejaskan gelagat dalam goroutine tersebut.
Pertimbangkan kod ini:
var a, b int func f() { a = 1 b = 2 } func g() { print(b) print(a) } func main() { go f() g() }
Disebabkan kepada penyusunan semula model memori, anda mungkin melihat bahawa g() mencetak 2 dan kemudian 0. Walaupun tugasan a datang sebelum b masuk f(), pengkompil boleh mengoptimumkan kod dengan menetapkan b terlebih dahulu atas sebab kecekapan.
Dalam goroutine yang sama, susunan tugasan dijamin, kerana pengkompil tidak boleh menyusunnya semula jika ia akan menyebabkan masalah. Walau bagaimanapun, dalam contoh yang diberikan, tiada penyegerakan antara kedua-dua goroutine. Oleh itu, pengkompil tidak perlu mempertimbangkan potensi kesan penyusunan semula pada goroutine yang lain.
Jika anda memperkenalkan penyegerakan antara goroutine, seperti WaitGroup atau mutex, pengkompil akan memastikan tiada ketidakkonsistenan di titik penyegerakan. Dalam kes ini, anda menjangkakan g() mencetak 2 dan 1, kerana kedua-dua tugasan akan diselesaikan sebelum panggilan print() dipanggil.
Memahami aspek model ingatan GoLang ini adalah penting untuk menulis atur cara serentak dan mengelakkan keadaan perlumbaan yang berpotensi atau isu lain yang mungkin timbul akibat penyusunan semula yang tidak dijangka.
Atas ialah kandungan terperinci Mengapa Rutin Pergi Saya Mencetak Nilai Tidak Dijangka Kerana Susunan Semula Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!