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
Libérer: 2025-01-15 06:43:44
original
456 Les gens l'ont consulté

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 :

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); }
    }
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal