Maison >développement back-end >C++ >Pourquoi « wait » est-il interdit dans une instruction « lock » en 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!