|
Cette instruction de verrouillage acquiert un verrou mutuellement exclusif sur un objet donné, exécute un bloc d'instructions, puis libère le verrou. Pendant qu'il détient le verrou, le thread qui le détient peut l'acquérir et le relâcher à nouveau. Tout autre thread est empêché d'acquérir le verrou et doit attendre jusqu'à ce que le verrou soit libéré.
Récapitulation :
.net/c# user multithreaded concurrent lock(string) {...} Explication détaillée h ttps:// www.itsvse.com/thread-7764-1-1.html Utilisation du code de verrouillage
Équivalent à
On peut supposer que le code sous-jacent de Lock est l'implémentation de Monitor.
Comme le code utilise un bloc try ... finally, le verrou est libéré même si une exception est levée dans le corps de la déclaration de verrouillage.
Il est très important de ne pas utiliser l' opérateur await lock dans le corps de la déclaration !
Documentation : https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement
J'ai testé le code moi-même, en utilisant Task pour acquérir le verrou et en utilisant await pour bloquer, avec le code suivant :
Après avoir exécuté le code suivant plusieurs fois, le résultat de l'exécution n'est pas celui attendu.
Pourquoi ? Si vous essayez d'utiliser le mot-clé lock tout en utilisant le mot-clé await dans un bloc de verrouillage, vous obtenez cette erreur de compilation : cannot await in the body of a lock statement. La raison en est qu'une fois await terminé, la méthode peut s'exécuter dans un thread différent de celui qui a précédé le mot-clé await (le thread appelant). le mot-clé lock n'est pas utilisé de la même manière que l'instruction lock. Le mot-clé lock exige que leverrou soit acquis et libéré dans lemême thread. En modifiant le code, il est plus intuitif de comprendre pourquoi :
L'identifiant du thread qui acquiert le verrou et l'identifiant du thread qui libère le verrou ne sont manifestement pas dans le même thread, de sorte que le verrou ne peut pas être libéré avec succès, comme le montre l'illustration ci-dessous :
Essayez de modifier le code, utilisez le test de thread, exécutez-le plusieurs fois, il répond à l'attente, le code est le suivant :
(Fin)
|
Article précédent :(Report).NET/C# sera un dossier emballé dans un fichier zipNext:Redis utilisant les détails d'un script Lua
|