Rumah >pembangunan bahagian belakang >C++ >Kenapa `Lock (ini)` Berbahaya dalam pengaturcaraan multithreaded?

Kenapa `Lock (ini)` Berbahaya dalam pengaturcaraan multithreaded?

Patricia Arquette
Patricia Arquetteasal
2025-01-31 06:26:091005semak imbas

Why is `lock(this)` Dangerous in Multithreaded Programming?

Elakkan penggunaan

: bahaya tersembunyi dalam pengaturcaraan multi -threaded lock(this) Dokumen Microsoft jelas disyorkan untuk mengelakkan penggunaan

pada kehendak, dan memahami sebab -sebab dan akibat yang berpotensi di belakangnya.

lock(this) Masalah penguncian yang tidak terkawal

Inti masalah adalah mustahil untuk mengawal benang lain yang dapat mengunci objek yang sama. Ini boleh membawa kepada kunci mati.

Anggapkan bahawa objek didedahkan secara terbuka, sesiapa sahaja boleh mendapatkan rujukannya. Jika mana -mana rujukan ini digunakan untuk mengunci objek, pencipta objek mungkin tidak mengetahui apa -apa mengenainya, yang akan merumitkan pelaksanaan selari dan boleh menyebabkan kesilapan kemalangan.

memusnahkan enkapsulasi dan mengurangkan kejelasan

Menggunakan prinsip pembungkusan haram , mekanisme penguncian terdedah kepada akses awam. Ini menjadikan sukar untuk memahami penggunaan dan tingkah laku yang diharapkan. Sebaliknya, mengunci dengan bidang persendirian dapat memberikan pemisahan titik perhatian yang lebih jelas dan memastikan penguncian secara dalaman tanpa terdedah kepada butiran pelaksanaan yang tidak perlu. bahaya salah faham dan rentetan

lock(this) Beberapa salah faham secara tidak sengaja menyumbang kepada penggunaan

. Salah satu salah faham adalah bahawa objek mengunci itu sendiri adalah untuk membuat objek itu tidak boleh diubah atau mengelakkan pengubahsuaian. Ini tidak berlaku. Objek parameter yang diluluskan kepada pernyataan

hanya untuk mengenal pasti kunci untuk mengenal pasti objek kunci. Perangkap lain adalah untuk cuba menggunakan rentetan sebagai kunci dalam pernyataan

. Kerana rentetan tidak berubah dan dikongsi antara aplikasi, pendekatan ini boleh menyebabkan konflik kunci yang tidak dijangka. Sebaliknya, lebih baik menggunakan objek peribadi sebagai kunci untuk mengawal mekanisme kunci dengan lebih baik.

lock(this) Kajian kes: Keselamatan benang dalam rawatan selari lock

Untuk menjelaskan masalah yang berpotensi, sila pertimbangkan kod C#berikut: lock

Dalam kaedah utama, buat pelbagai benang, dan setiap benang cuba melakukan operasi pada objek . kaedah untuk cuba menggunakan kunci objek

mendapatkan objek. Walau bagaimanapun, kaedah dan juga cuba mengunci objek secara langsung atau tidak langsung, dan menggunakan

sebagai kunci. Ini akan membawa kepada konflik kunci yang tidak dijangka dan kunci mati, kerana kod itu cuba melakukan operasi di atasnya apabila mengunci objek benang lain. (Diandaikan bahawa kaedah TimeWarp dan Namechaange juga menggunakan kunci dan menggunakan ini atau orang. Nama sebagai objek kunci. Teks asal tidak memberikan kod lengkap)

Singkatnya, gunakan
<code class="language-csharp">public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }

    public void LockThis()
    {
        lock (this)
        {
            System.Threading.Thread.Sleep(10000);
        }
    }
}</code>
untuk memusnahkan keselamatan benang dan mewujudkan kebuntuan yang berpotensi. Menggunakan mekanisme penguncian pembungkusan medan peribadi, dan menggunakan objek peribadi sebagai kunci dalam pernyataan

, ia dapat memberikan kaedah penyegerakan thread yang lebih mantap dan boleh dipercayai. Person

Atas ialah kandungan terperinci Kenapa `Lock (ini)` Berbahaya dalam pengaturcaraan multithreaded?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn