Walaupun kebijaksanaan konvensional, ada kemungkinan untuk benang C# menyimpan nilai dan mengabaikan perubahan yang dibuat pada nilai itu pada urutan lain. Tingkah laku ini timbul daripada model memori asas dalam C#, yang membenarkan pengoptimuman yang mungkin membawa kepada nilai benang yang tidak konsisten.
Walaupun secara umumnya disyorkan untuk menggunakan kunci untuk penyegerakan benang, terdapat senario tertentu di mana cache nilai boleh berlaku , seperti:
Model memori C# membahagi ingatan kepada kawasan yang tidak menentu dan tidak menentu. Memori tidak meruap, yang biasanya digunakan untuk pembolehubah yang tidak selalunya berubah, mungkin dicache oleh pemproses atau pengkompil atas sebab prestasi. Cache ini boleh membawa kepada situasi di mana satu utas mengubah suai nilai dalam ingatan, tetapi satu thread lain terus membaca nilai cache.
Pengkompil C# dan JIT (Just-In -Masa) pengkompil boleh melakukan pengoptimuman untuk meningkatkan prestasi. Khususnya, mereka mungkin menyusun semula arahan atau menghapuskan bacaan memori yang tidak perlu. Pengoptimuman ini boleh membawa kepada situasi di mana nilai dicache oleh pemproses atau pengkompil, walaupun nilai itu telah diubah suai oleh urutan lain.
Kod sampel yang disediakan dalam soalan mempamerkan tingkah laku ini. Apabila medan berhenti ditetapkan kepada benar, utas DoWork mungkin terus membaca nilai cache, walaupun utas lain telah mengubah suainya. Ini kerana medan berhenti tidak meruap dan pengkompil dibenarkan untuk menyimpan cache nilainya.
Contoh balas yang disediakan dalam jawapan menunjukkan cara tingkah laku ini boleh membawa kepada masalah. Dalam contoh ini, medan berhenti tidak dibuat tidak menentu dan urutan DoWork terus berjalan selama-lamanya.
Walaupun mungkin tergoda untuk bergantung pada andaian bahawa masa jalan C# akan mengendalikan penyegerakan benang dengan berkesan, adalah penting untuk memahami model memori asas dan potensi implikasinya. Dengan menggunakan kunci atau pembolehubah yang tidak menentu dengan sewajarnya, pembangun boleh menjamin bahawa urutan akan sentiasa mempunyai nilai yang paling terkini, menghalang tingkah laku yang tidak dijangka dan memastikan ketepatan aplikasi berulir.
Atas ialah kandungan terperinci Bolehkah C# Thread Cache Nilai dan Kekal Tidak Mengetahui Kemas Kini daripada Thread Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!