Penyegerakan Salah dalam Bahasa Go
Dalam bidang pengaturcaraan Go, penyegerakan memainkan peranan penting dalam memastikan integriti kod serentak. Walau bagaimanapun, memahami nuansa penyegerakan boleh menjadi mencabar, seperti yang dibuktikan oleh pemerhatian yang pelik dalam model memori Go.
Kebimbangan berpunca daripada coretan kod yang menetapkan dua pembolehubah integer, a dan b, kepada nilai yang berbeza dalam fungsi f() dan kemudian mencetak nilainya dalam fungsi g(). Tingkah laku yang tidak dijangka timbul apabila fungsi g() boleh mencetak 2 (nilai yang diberikan kepada b) diikuti dengan 0 (nilai sifar lalai bagi a).
Tingkah laku yang membingungkan ini dikaitkan dengan kerumitan berikut:
Permulaan dan Penyusunan Semula Pembolehubah:
Pembolehubah a dan b dimulakan dengan sifar nilai sebelum sebarang pelaksanaan fungsi dimulakan. Walau bagaimanapun, susunan nilai baharu diberikan kepada mereka dalam fungsi f() mungkin berbeza-beza. Pengkompil dan pemproses Go dibenarkan untuk menyusun semula bacaan dan tulis dalam satu goroutine selagi ia tidak mengubah tingkah laku yang dimaksudkan dalam skop tersebut. Oleh itu, dalam fungsi f(), pengkompil boleh menyusun semula tugasan kepada a dan b atas sebab kecekapan.
Penyegerakan Goroutine:
Contoh kod tidak mempunyai sebarang mekanisme penyegerakan antara dua goroutine. Akibatnya, pengkompil tidak menjamin konsistensi pada titik di mana fungsi g() mencetak pembolehubah. Pengkompil tidak mempunyai kewajipan untuk memastikan kedua-dua tugasan dalam fungsi f() telah selesai sebelum fungsi g() melaksanakan pernyataan print()nya.
Mata Penyegerakan:
Kepada menguatkuasakan konsistensi, primitif penyegerakan mesti digunakan. Apabila menggunakan primitif ini, pengkompil memastikan tiada ketidakkonsistenan pada ketika itu. Jika titik penyegerakan diwujudkan sebelum print() memanggil, nilai yang ditetapkan bagi a dan b (2 dan 1, masing-masing) akan dicetak, mengekalkan susunan operasi yang dimaksudkan.
Pada dasarnya, memahami penyegerakan dalam Go memerlukan penghargaan terhadap permulaan pembolehubah, penyusunan semula dan peranan primitif penyegerakan dalam mewujudkan konsistensi merentas goroutin. Dengan memanfaatkan konsep ini, pengaturcara boleh memastikan pelaksanaan kod Go serentak mereka yang boleh dipercayai.
Atas ialah kandungan terperinci Mengapa Kod Go Saya Mempamerkan Pesanan Pembolehubah Tidak Dijangka dalam Goroutine Serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!