Comment trouver un interblocage et l'empêcher en C #
J'ai eu un entretien à seulement 5 minutes en arrière, je n'ai pas à répondre à 3 questions, quelqu'un pourrait s'il vous plaît aider moi.
Question:
Comment chercher des scénarios de blocage en Multithread fonction de l'application et de l'empêcher ?
Réponse que j'ai donné:
J'ai donné la définition de blocage et de verrouillage, mutex, de surveiller, de sémaphore. Il m'a dit, que ce sont des outils, mais de la façon de regarder une situation de blocage que parce que quand nous utilisons ces outils à l'aveuglette, il en coûte à la performance qu'il a dit 🙁
Merci de m'aider à comprendre cela.
source d'informationauteur Learner
Vous devez vous connecter pour publier un commentaire.
Outils d'analyse des performances peut également être utile dans l'identification des blocages, entre autres. Cette question permettra de donner un aperçu dans cette rubrique: C#/.NET outil d'analyse pour trouver des conditions de course/blocages .
Analyse visuelle du code et de la bonne utilisation de verrous est utile aussi (vous devriez être en mesure de détecter les problèmes potentiels dans le code lors de l'inspection), mais peut être très difficile pour les applications les plus complexes. Parfois, les blocages sont visibles uniquement lorsque vous exécutez le code, pas simplement en inspectant le code.
Je ne sais pas trop de votre interlocuteur. Certains voudront peut-être voir combien vous savez de verrouillage de normes ou de principes, certains peuvent vouloir voir si vous savez comment l'utiliser vos outils, certains voudront peut-être les deux. Dans la société où je travaille, par exemple, l'utilisation d'outils (notamment ceux que nous avons déjà propre et utilisation) est très appréciée. Mais cela n'implique pas, on ne doit pas avoir les compétences qui permettrait d'éviter le codage des blocages dans la première place.
Verrouillage quelque chose juste pour le plaisir de verrouillage affecte les performances, comme fil d'attendre les uns des autres. Vous devez analyser le flux de travail afin de déterminer ce qui a vraiment besoin d'être verrouillé, quand, avec quel type de serrure (simple
lock
ou peut-être unReaderwriterlockslim
).Il existe de nombreuses typique des moyens pour éviter l'impasse.
Par exemple lors de l'utilisation de
Readerwriterlockslim
vous pouvez utiliser un délai d'attente pour éviter les blocages (si vous attendez trop, vous abord l'acquisition de la serrure) http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspxEt vous devriez être en mesure de proposer de tels délais d'attente.
À une telle question que je voudrais attendre au moins une mention de la classique de cas de blocages, comme la mauvaise utilisation de imbriqués les verrous (vous devriez être en mesure de connaître peut vous éviter d'eux, pourquoi ils sont mauvais, etc.).
Le sujet est très grand... vous pouvez aller sur et sur ce sujet. Mais sans definitios. Savoir ce qu'est une serrure et de savoir utiliser des verrous/sémaphores/mutex à grande échelle et multi-threding applications sont 2 choses différentes.
Il semble que vous eu des problèmes à expliquer comment les blocages peuvent se produire et comment ils peuvent être évités.
Blocage se produit lorsque chacun des deux (au minimum deux) threads tentent d'acquérir un verrou sur une ressource déjà verrouillé par un autre. Thread 1 verrouillé sur les Ressources 1 tente d'acquérir un verrou sur la Ressource 2. Dans le même temps, le Thread 2 a un verrou sur la Ressource 2 et il tente d'acquérir le verrou sur la Ressource 1. Deux threads ne jamais abandonner leurs verrous, d'où un BLOCAGE se fait.
La façon la plus simple pour éviter un blocage est d'utiliser une valeur de délai d'expiration. Le Moniteur de classe (du système.Le filetage.Monitor) peut définir un délai d'attente lors de l'acquisition d'un verrou.
Exemple
Lire Plus
Je pense que l'interview est de vous poser une question piège. Si vous pouviez utiliser l'analyse statique pour éviter l'impasse... personne n'aurait l'impasse!
Personnellement, quand je regarde pour le blocage, je commence par trouver les fonctions où la section critique s'étend sur plus de l'appel de la fonction. Par exemple
Ce n'est pas vraiment clair ce que
func2
est en train de faire. Peut-être qu'il distribue un événement sur le même thread, ce qui signifie que l'événement est toujours une partie de la section critique. Peut-être que c', puis verrouille sur un différents de verrouillage. Peut-être qu'il distribue dans le pool de threads et de plus est re-venu en raison de son désormais sur un autre fil! Ces sortes de lieux où vous pouvez commencer à voir des scénarios de blocage qui se passe: lorsque vous avez plusieurs non réentrant de verrouillage endroits.D'autres fois, lors du traçage des scénarios de blocage, je revenir en arrière et j'essaie de trouver où sont tous les threads créés. Je donne la pensée de chaque fonction et où il peut être en cours d'exécution. Si vous n'êtes pas sûr, en ajoutant à l'enregistrement pour vous connecter à l'appel est venu de peut aussi aider.
Vous pouvez également éviter les blocages en utilisant verrouillage de libérer des structures de données (mais ceux-ci exigent autant de bien qu'à l'utilisation). Vous souhaitez réduire votre accès à la serrure libre de la structure parce que chaque fois que vous accédez à ce qu'on peut changer.
Comme mentionné dans une autre réponse, vous pouvez utiliser les mutex avec des délais d'attente, mais qui n'est pas garanti pour toujours travail (si votre code doit travailler plus longtemps que le délai d'attente?). Il a été mentionné dans un autre commentaire que c'est peut-être ce que l'intervieweur demandait. Je trouve que dans la production, ce n'est pas vraiment une bonne idée. Délais d'attente varient tout le temps, peut-être que quelque chose a pris plus de temps que prévu à courir et frapper un délai d'attente. Je pense que c'est mieux de le laisser impasse, les processus de vidage, puis de trouver exactement ce qui retenait les serrures et de résoudre le problème. Bien sûr, si les besoins de votre entreprise ne peut pas permettre cela, alors vous pouvez l'utiliser dans le cadre d'une défensive stratégie de codage avec verrouillage intelligent choix de placement.
Je ne suis pas d'accord avec votre entrevue qui verrouille toujours ajouter un énorme problème de performance. Uncontended serrures/mutex/etc premier test comme un spinlock avant de passer au large à l'OS et spinlocks sont bon marché.
En général, la meilleure façon d'éviter un blocage, est de comprendre le flux de programme. Chaque fois que vous introduisez un nouveau verrou de l'objet de réfléchir à l'endroit où il est utilisé et utilise la chaîne.
La plus simple solution de ce problème serait de toujours dormir/attendre avec un assez grand délai d'attente. Si ce délai d'attente se produit, vous savez que quelque chose a pris plus de temps que ce qu'elle devrait avoir, et vous avez une bonne chance d'un blocage ou d'un autre bug.
Quand
WaitOne
retournefalse
il aura attendu 30 secondes et la serrure ne serait toujours pas été publié. Si vous savez que tous les verrouillé les opérations devraient se terminer dans les millisecondes (si non, alors il suffit d'augmenter le délai d'attente), alors c'est une très bonne indication que quelque chose s'est mal passé.