Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 49134|Répondre: 4

[Source] Le moniteur principal de verrouillage .NET/C# offre une explication approfondie

[Copié le lien]
Publié sur 29/04/2021 09:54:10 | | | |
L’instruction lock prend le mutex d’un objet donné, exécute un bloc d’instructions, puis libère le verrou. Lorsqu’on tient un cadenas, le fil qui le tient peut l’accrocher et le libérer à nouveau. Tout autre fil est bloqué pour obtenir la serrure et attend que la serrure soit libérée.

Révision:

.net/c# verrouillage de concurrence multithread utilisateur (string){...} Explication détaillée
https://www.itsvse.com/thread-7764-1-1.html

Utilisez le code de verrouillage

Équivalent à

On peut penser que le code sous-jacent de Lock est implémenté par Monitor.

Puisque le code utilise try... finalblock, donc même si une exception est ajoutée dans le corps de l’instruction lock, le lock est libéré.

Vous ne pouvez pas utiliser l’opérateur await verrouiller le corps de la déclaration.Vous ne pouvez pas l’utiliser dans le corps de la déclarationattendsVerrouillage opérateur。 Vous ne pouvez pas utiliser l’opérateur await verrouiller le corps de la déclaration. Vous ne pouvez pas utiliser l’opérateur await verrouiller le corps de la déclaration. Cette phrase est très importante !

Documentation:La connexion hyperlientérée est visible.

Je teste moi-même le code,Utilise Tâche pour obtenir le verrou et utilise Attendre pour bloquer, le code est le suivant :

Après avoir exécuté plusieurs fois le code suivant, le résultat n’est pas celui attendu.



Pourquoi ? Si vous essayez d’utiliser le mot-clé await lors de l’utilisation du mot-clé await dans le bloc de verrouillage, vous obtiendrez cette erreur de compilation : ne peut pas attendre dans le corps d’une instruction de verrouillage. La raison est qu’après avoir complété await, la méthode peut s’exécuter dans un autre thread au lieu du thread (thread appelant) avant le mot-clé await.mot-clé verrouillémême filPrends le verrou et déverrouille le verrou dans le verrou
Modifiez le code pour voir la raison de manière plus intuitive :

Obtenez l’identifiant du filetage du verrou et l’identifiant du filetage du déverrouillage,Évidemment, pas dans un fil de discussion, de sorte que le verrou ne peut pas être libéré avec succès, comme montré dans la figure ci-dessous :



J’ai essayé de modifier le code, testé avec un thread, exécuté plusieurs fois, et ça a fonctionné comme prévu, le code est le suivant :



(Fin)





Précédent:(to).NET/C# pour emballer le dossier dans un fichier zip
Prochain:Redis utilise des scripts Lua pour des explications détaillées
 Propriétaire| Publié sur 10/02/2022 09:20:09 |

Ne déverrouillez pas la serrure





 Propriétaire| Publié sur 25/06/2023 19:57:43 |
La méthode de synchronisation d’objets était appelée à partir d’un bloc de code non synchronisé.
Le code suivant donnera une erreur comme ci-dessus




 Propriétaire| Publié sur 12/08/2023 19:47:49 |
Syntaxe de verrouillage sucre, comme montré ci-dessous :






 Propriétaire| Publié sur 11/07/2024 10:44:02 |
【Tourner】C# concurrence multi-threads sous divers verrous
https://www.itsvse.com/thread-10561-1-1.html
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com