Maison >développement back-end >C++ >Pourquoi « wait » est-il interdit dans une instruction « lock » en C# ?

Pourquoi « wait » est-il interdit dans une instruction « lock » en C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-15 06:43:44438parcourir

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

Comprendre la restriction : await et lock en C#

Le mot-clé await de C# est crucial pour la programmation asynchrone, permettant des opérations non bloquantes. Cependant, utiliser await dans une instruction lock est strictement interdit. Cette restriction est un choix de conception clé pour éviter une source courante d'erreurs : les blocages.

La documentation de Microsoft explique qu'une expression await dans un lock crée un risque. L'exécution du code peut s'interrompre après que le await cède le contrôle, reprenant plus tard sur un thread potentiellement différent. Cet intervalle de temps peut conduire à des situations dans lesquelles d'autres threads obtiennent des verrous, inversant l'ordre des verrous et entraînant un blocage.

Examinons un exemple hypothétique :

<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>

Ce code tente d'imiter le verrouillage asynchrone, mais comme l'indique le compilateur, il est sujet à un blocage indéfini au sein de ExitDisposable.Dispose(), conduisant potentiellement à des blocages. Cela se produit parce que Monitor.Exit peut s'exécuter sur un thread différent de celui qui a acquis le verrou, violant potentiellement l'ordre de verrouillage.

Essentiellement, l'interdiction de await dans lock est une mesure proactive pour éviter les blocages dans les applications multithread. Il est préférable d'éviter de combiner des opérations asynchrones avec des instructions lock et d'envisager des méthodes de synchronisation alternatives telles que des verrous lecteur-enregistreur ou des primitives de synchronisation de System.Threading.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn