Pengaturcaraan berbilang benang C#: gunakan kata kunci yang tidak menentu dengan berhati-hati, mekanisme penguncian lebih dipercayai
Dalam pengaturcaraan berbilang benang C#, kata kunci volatile
sering disalahertikan dan disalahgunakan. Artikel ini akan melihat dengan lebih dekat di mana volatile
berguna dan menerangkan sebab ia harus dielakkan secara amnya.
Takrifan dan penggunaan volatile
Pakar C# veteran Eric Lippert menegaskan bahawa volatile
bukan sahaja menghalang pengoptimuman pengkompil, tetapi juga mengarahkan pemproses untuk memastikan akses kepada nilai terkini, walaupun ia menghentikan pemproses lain. Namun, pemahaman ini tidak lengkap.
Semantik sebenar yang tidak menentu
Sebenarnya, semantik volatile
operasi baca dan tulis adalah lebih kompleks. Mereka tidak menjamin penyegerakan antara semua pemproses, tetapi hanya memberikan jaminan yang lebih lemah pada susunan akses memori. Jaminan yang lebih kukuh dicapai melalui operasi seperti penciptaan benang, mekanisme penguncian atau menggunakan kaedah Interlocked
.
Mengapa mengelak daripada menggunakan medan yang tidak menentu?
Lippert sangat mengesyorkan untuk mengelakkan penggunaan medan volatile
. Mereka menunjukkan percubaan untuk menangani isu berbilang benang tanpa penyegerakan yang betul. Mekanisme kunci memberikan konsistensi memori yang lebih kukuh dan jaminan pesanan akses.
Jarang sekali mekanisme penguncian terlalu perlahan. Selain itu, risiko ralat kod disebabkan salah faham model memori adalah sangat tinggi. Oleh itu, biasanya disyorkan untuk menggunakan mekanisme penguncian dan bukannya medan volatile
.
Lebih banyak sumber
Untuk maklumat lanjut, sila rujuk artikel berikut:
Atas ialah kandungan terperinci Sekiranya saya menggunakan kata kunci yang tidak menentu dalam C# multithreading, atau kunci sentiasa lebih baik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!