Rumah >pembangunan bahagian belakang >C++ >Bolehkah C# Threads Cache Nilai dan Abaikan Kemas Kini daripada Thread Lain?
Bolehkah Benang C# Benar-benar Cache Nilai dan Abaikan Perubahan daripada Benang Lain?
Dalam pengaturcaraan berbilang benang, adalah penting untuk mengekalkan konsistensi data merentas benang. Satu soalan biasa ialah sama ada utas C# boleh menyimpan nilai dan mengabaikan perubahan yang dibuat oleh utas lain.
Memahami Model Memori
Rangka Kerja .NET menyediakan model memori yang mentakrifkan cara utas berinteraksi dengan memori yang dikongsi. Menurut model ini, pembolehubah sama ada selamat untuk benang atau tidak selamat untuk benang. Pembolehubah selamat benang boleh diakses atau diubah suai oleh berbilang benang secara serentak tanpa kerosakan data. Pembolehubah bukan benang selamat, sebaliknya, boleh menyebabkan keadaan perlumbaan dan ketidakkonsistenan data jika diubah suai daripada berbilang rangkaian secara serentak.
Tuntutan dan Tuntutan Balas
Sesetengahnya artikel mendakwa bahawa utas C# boleh menyimpan nilai dan mengabaikan perubahan yang dibuat pada utas lain, walaupun untuk pembolehubah tidak selamat untuk benang. Mereka berhujah bahawa tingkah laku ini disebabkan oleh model memori yang tidak menentu, yang membolehkan benang mempunyai salinan pembolehubah cache mereka sendiri.
Walau bagaimanapun, pengkritik berpendapat bahawa masa jalan .NET menghilangkan kerumitan model memori, memastikan bahawa perubahan yang dibuat pada satu urutan boleh dilihat oleh urutan lain.
Contoh Balas dan Penyelesaian
Untuk mengesahkan tuntutan, versi semakan kod yang dipersoalkan dibentangkan:
private static volatile bool stopping = false;
Kata kunci yang tidak menentu memastikan perubahan pada pembolehubah berhenti dapat dilihat dengan serta-merta kepada semua benang. Pengubahsuaian ini mengalih keluar sebarang potensi untuk caching dan menjamin bahawa program berkelakuan seperti yang dimaksudkan:
Output: Main exit DoWork exit 654
Kesimpulan
Walaupun artikel yang dipetik mungkin menunjukkan potensi tingkah laku caching dengan bukan- pembolehubah tidak menentu dalam kod tidak terurus, masa jalan .NET menguatkuasakan akses selamat benang kepada pembolehubah dikongsi. Akibatnya, dakwaan bahawa urutan C# boleh menyimpan nilai dan mengabaikan perubahan pada urutan lain adalah tidak berasas untuk aplikasi kod terurus biasa.
Atas ialah kandungan terperinci Bolehkah C# Threads Cache Nilai dan Abaikan Kemas Kini daripada Thread Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!