J'ai eu une discussion avec un coéquipier sur le verrouillage .NET. Il est vraiment quelqu'un de brillant, avec une vaste expérience de niveau inférieur et le niveau supérieur de la programmation, mais son expérience avec le plus faible niveau de programmation dépasse de loin la mienne. De toute façon, Il fait valoir que .NET de verrouillage doit être évitée sur les systèmes critiques devraient être sous une lourde charge, si possible, pour éviter que la petite, certes, la possibilité d'un "zombie thread" panne d'un système. J'utilise régulièrement de verrouillage et je ne sais pas ce qu'est un "zombie fil" a été, j'ai donc demandé. L'impression que j'ai eue de son explication est qu'un zombie fil est un fil qui a été résilié, mais en quelque sorte détient toujours sur certaines ressources. Un exemple qu'il a donné de la façon dont un zombie thread pourrait casser un système a un thread commence une procédure après le verrouillage d'un objet, et puis, à un certain point résilié avant que le verrou peut être libéré. Cette situation a le potentiel de provoquer une panne du système, parce que finalement, les tentatives pour mettre en œuvre cette méthode entraînera dans les fils d'attente pour accéder à un objet qui ne sera jamais retourné, parce que le fil qui est à l'aide de l'objet verrouillé est mort.
Je pense que j'ai compris l'essentiel, mais si je suis hors de la base, s'il vous plaît laissez-moi savoir. Le concept fait sens pour moi. Je n'étais pas complètement convaincu que c'était un véritable scénario qui pourrait se produire dans .NET. Je n'ai jamais encore entendu parler de "zombies", mais je dois reconnaître que les programmeurs qui ont travaillé en profondeur dans les niveaux inférieurs ont tendance à avoir une compréhension plus profonde de l'informatique de base (comme le filetage). Je certainement ne voient la valeur de verrouillage, cependant, et j'ai vu beaucoup de classe mondiale programmeurs levier de verrouillage. J'ai aussi une capacité limitée pour évaluer cela pour moi parce que je sais que l' lock(obj)
déclaration est vraiment juste sucre syntaxique pour:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
et parce qu' Monitor.Enter
et Monitor.Exit
sont marquées extern
. Il semble concevable que .NET ne fait que certains types de traitement qui protège les fils de l'exposition aux composants du système que pouvait avoir ce genre d'impact, mais c'est purement spéculatif, et probablement juste, fondée sur le fait que je n'ai jamais entendu parler de "zombie fils" avant de. Donc, j'espère que je peux obtenir des commentaires sur ce sujet ici:
- Est-il une meilleure définition de "zombie fil" que ce que j'ai expliqué ici?
- Pouvez zombie fils se produire .NET? (Pourquoi/Pourquoi pas?)
- Le cas échéant, Comment pourrais-je forcer la création d'un zombie fil .NET?
- Le cas échéant, Comment puis-je le levier de verrouillage sans risquer un zombie fil du scénario .NET?