Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Pernyataan `lock` C# Berfungsi Di Bawah Hud?
Selami cara dalaman lock
pernyataan
Pembangun sering menggunakan pernyataan lock
untuk melindungi pelaksanaan kod apabila berurusan dengan objek yang tidak selamat untuk benang. Tetapi apa sebenarnya yang berlaku di bawah hud apabila berbilang benang berinteraksi dengan kod yang dilindungi ini?
Selam Dalam: Menjejaki Pelaksanaan lock
Kenyataan
Dalam C# 3.0, pernyataan lock
diterjemahkan kepada kod berikut:
<code class="language-C#">var temp = obj; Monitor.Enter(temp); try { // 非线程安全代码 } finally { Monitor.Exit(temp); }</code>
Dalam C# 4.0, proses ini telah diubah suai dan kod yang dihasilkan adalah seperti berikut:
<code class="language-C#">bool lockWasTaken = false; var temp = obj; try { Monitor.Enter(temp, ref lockWasTaken); // 非线程安全代码 } finally { if (lockWasTaken) { Monitor.Exit(temp); } }</code>
Monitor.Enter
Fungsi
Monitor.Enter
memainkan peranan penting dalam kefungsian pernyataan lock
. MSDN menerangkan operasinya seperti berikut:
" Gunakan Enter
untuk mendapatkan Monitor
objek diluluskan sebagai hujah. Jika utas lain telah melaksanakan Enter
untuk objek tetapi belum lagi melaksanakan Exit
yang sepadan, utas semasa akan menyekat sehingga satu lagi Benang melepaskan objek ”
Pada asasnya, Monitor.Enter
menjamin akses eksklusif kepada objek. Jika benang lain cuba memperoleh kunci yang sama, ia akan digantung sehingga kunci dilepaskan. Berbilang panggilan ke Enter
daripada urutan yang sama tidak akan menyebabkan sekatan, tetapi memerlukan bilangan Exit
panggilan yang sama untuk membuka kunci objek dan membenarkan urutan menunggu menyambung semula pelaksanaan.
Masa menunggu yang tidak terhingga
Perlu diingat bahawa Monitor.Enter
akan menunggu selama-lamanya sehingga kunci tersedia. Tidak seperti beberapa mekanisme penguncian, ia tidak menguatkuasakan tamat masa.
Atas ialah kandungan terperinci Bagaimanakah Pernyataan `lock` C# Berfungsi Di Bawah Hud?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!