架构师_程序员_码农网

N Récupérer le mot de passe
S'inscrire

QQ登录

Une seule étape pour commencer

Recherche
Vues :28269|Réponses : 4
打印 上一主题 下一主题

[ NET/C# Verrouillage Principe Moniteur Explication en profondeur

[copier le lien]
L 跳转到指定楼层
propriétaire
发表于 2021-4-29 09:54:10|只看该作者回帖奖励 | Mode lecture
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 zip
Next:Redis utilisant les détails d'un script Lua
Le code farmer network, seulement publié dans le processus de la pratique, a rencontré des difficultés techniques, ne pas induire les autres en erreur.
sofabed
owner|Envoyé le 2022-2-10 09:20:09|Ne voir que cet auteur

Ne pas déverrouiller la serrure





Coder.com, publié uniquement dans le processus de pratique, a rencontré des difficultés techniques, ne pas induire les autres en erreur.
Bancs
楼主|发表于 2023-6-25 19:57:43|只看该作者
La méthode de synchronisation d'objets a été appelée à partir d'un bloc de code non synchronisé.
Le code suivant signalera une erreur comme ci-dessus:




Code Farmer, uniquement publié dans le processus de pratique, a rencontré des difficultés techniques, ne pas induire les autres en erreur.
plancher
楼主|发表于 2023-8-12 19:47:49|只看该作者
verrouillez le sucre syntaxique, comme indiqué ci-dessous :






Le réseau des agriculteurs du code, publié uniquement dans le processus de pratique, a rencontré des difficultés techniques, ne pas induire les autres en erreur.
ugg boots sale
5#
楼主|发表于 2024-7-11 10:44:02|只看该作者
Performances de différents verrous pour la concurrence multithread en C#
h ttps:// www.itsvse.com/thread-10561-1-1.html
La première chose que j'aimerais dire, c'est que je ne suis pas sûr de pouvoir le faire, mais je suis sûr de pouvoir le faire.
Vous devez vous connecter avant de pouvoir poster Log in | Register

C ette version des règles intégralesR


AVERTISSEMENT : Tous les logiciels, matériels de programmation ou articles publiés par Code Farmer sont destinés à être utilisés uniquement à des fins d'apprentissage et de recherche ; le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon, toutes les conséquences seront supportées par les utilisateurs eux-mêmes. Les informations de ce site proviennent du réseau, le litige sur les droits d'auteur n'a rien à voir avec ce site. Vous devez supprimer complètement le contenu susmentionné de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, soutenez le logiciel authentique, achetez l'enregistrement et obtenez un meilleur service authentique. En cas d'infraction, veuillez nous contacter par courrier électronique pour régler le problème.

Courrier To:help@itsvse.com

QQ | ( 鲁ICP备14021824号-2)|Sitemap

GMT+8, 2024-9-19 01:15

Réponse rapideRetour au débutRetour à la liste