Rumah > pembangunan bahagian belakang > C++ > Mengapakah `menunggu` Dilarang Di Dalam Pernyataan `kunci` dalam C#?

Mengapakah `menunggu` Dilarang Di Dalam Pernyataan `kunci` dalam C#?

Mary-Kate Olsen
Lepaskan: 2025-01-15 06:43:44
asal
391 orang telah melayarinya

Why is `await` Prohibited Inside a `lock` Statement in C#?

Memahami Sekatan: await dan lock dalam C#

Kata kunci

C#'s await adalah penting untuk pengaturcaraan tak segerak, membolehkan operasi tidak menyekat. Walau bagaimanapun, penggunaan await di dalam pernyataan lock adalah dilarang sama sekali. Sekatan ini ialah pilihan reka bentuk utama untuk mengelakkan punca ralat biasa: kebuntuan.

Dokumentasi Microsoft menerangkan bahawa ungkapan await dalam lock menimbulkan risiko. Pelaksanaan kod boleh dijeda selepas await menghasilkan kawalan, disambung semula kemudian pada urutan yang mungkin berbeza. Jurang masa ini boleh membawa kepada situasi di mana benang lain memperoleh kunci, membalikkan susunan kunci dan mengakibatkan kebuntuan.

Mari kita periksa contoh hipotesis:

<code class="language-csharp">class Async
{
    public static async Task<IDisposable> Lock(object obj)
    {
        while (!Monitor.TryEnter(obj))
            await Task.Yield();

        return new ExitDisposable(obj);
    }

    private class ExitDisposable : IDisposable
    {
        private readonly object obj;
        public ExitDisposable(object obj) { this.obj = obj; }
        public void Dispose() { Monitor.Exit(this.obj); }
    }
}</code>
Salin selepas log masuk

Kod ini cuba meniru penguncian tak segerak, tetapi seperti yang ditunjukkan oleh pengkompil, ia terdedah kepada sekatan tidak tentu dalam ExitDisposable.Dispose(), yang berpotensi membawa kepada kebuntuan. Ini berlaku kerana Monitor.Exit mungkin dilaksanakan pada urutan yang berbeza daripada urutan yang memperoleh kunci, yang berpotensi melanggar perintah kunci.

Pada dasarnya, larangan await dalam lock adalah langkah proaktif untuk mengelakkan kebuntuan dalam aplikasi berbilang benang. Adalah lebih baik untuk mengelak daripada menggabungkan operasi tak segerak dengan pernyataan lock dan pertimbangkan kaedah penyegerakan alternatif seperti kunci pembaca-penulis atau primitif penyegerakan daripada System.Threading.

Atas ialah kandungan terperinci Mengapakah `menunggu` Dilarang Di Dalam Pernyataan `kunci` dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan