Maison >développement back-end >C++ >Comment l'instruction C# `lock` fonctionne-t-elle sous le capot ?
Plongez dans le fonctionnement interne de la lock
déclaration
Les développeurs utilisent souvent l'instruction lock
pour protéger l'exécution du code lorsqu'ils traitent des objets non thread-safe. Mais que se passe-t-il exactement sous le capot lorsque plusieurs threads interagissent avec ce code protégé ?
Approfondissement : suivi de l'exécution des lock
déclarations
En C# 3.0, l'instruction lock
se traduit par le code suivant :
<code class="language-C#">var temp = obj; Monitor.Enter(temp); try { // 非线程安全代码 } finally { Monitor.Exit(temp); }</code>
En C# 4.0, ce processus a été modifié et le code généré est le suivant :
<code class="language-C#">bool lockWasTaken = false; var temp = obj; try { Monitor.Enter(temp, ref lockWasTaken); // 非线程安全代码 } finally { if (lockWasTaken) { Monitor.Exit(temp); } }</code>
Monitor.Enter
Fonction
Monitor.Enter
joue un rôle essentiel dans la fonctionnalité de la déclaration lock
. MSDN décrit son fonctionnement comme suit :
" Utilisez Enter
pour récupérer le Monitor
de l'objet passé en argument. Si un autre thread a déjà exécuté un Enter
pour l'objet mais n'a pas encore exécuté le Exit
correspondant, le thread actuel bloquera jusqu'à ce qu'un autre Le fil libère l'objet »
Essentiellement, Monitor.Enter
garantit un accès exclusif à l'objet. Si un autre thread tente d'acquérir le même verrou, il sera suspendu jusqu'à ce que le verrou soit libéré. Plusieurs appels à Enter
depuis le même thread ne provoqueront pas de blocage, mais nécessiteront le même nombre d'appels Exit
pour déverrouiller l'objet et permettre au thread en attente de reprendre l'exécution.
Temps d'attente infini
Il est à noter que Monitor.Enter
attendra indéfiniment que le verrou soit disponible. Contrairement à certains mécanismes de verrouillage, il n’impose pas de délai d’attente.
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!