43 votes

verrouillage de mot-clé en C#

Je comprends la fonction principale de la serrure mot clé de MSDN

Instruction lock (Référence C#)

Le verrouillage de mot-clé marque une déclaration bloc comme une section critique par l'obtention de la mutuelle-verrou d'exclusion pour un objet donné, de l'exécution d'une déclaration, puis en relâchant la verrouillage.

Quand les lock-elle être utilisée?

Par exemple, il fait sens avec applications multi-thread, car il protège les données. Mais est-il nécessaire lorsque la demande n'est pas de spin off tout les autres threads?

Est-il des problèmes de performances avec l'aide de serrure?

J'ai juste hérité d'une application à l'aide de verrouillage de partout, et il est mono-thread et je veux savoir, dois-je les laisser dans, sont-ils encore nécessaires?

Veuillez noter que ce n'est plus une question de connaissance générale, la vitesse de l'application est très bien, je veux savoir si c'est un bon modèle à suivre dans le futur ou ce devrait être évitée, sauf si absolument nécessaire.

58voto

Eric Points 5994

Quand les lock-elle être utilisée?

Un cadenas doit être utilisé pour protéger les ressources partagées dans le code multithread. Pas pour autre chose.

Mais est-il nécessaire lorsque la demande n'est pas de spin off tout les autres threads?

Absolument pas. C'est juste un moment de gaspilleur. Cependant assurez vous que vous n'êtes pas implicitement à l'aide de threads du système. Par exemple, si vous utilisez asynchronous I/O vous pouvez recevoir des rappels à partir d'un thread au hasard, pas votre fil d'origine.

Est-il des problèmes de performances avec l'aide de serrure?

Oui. Ils ne sont pas très importants dans un seul thread de l'application, mais pourquoi faire des appels que vous n'avez pas besoin?

...si c'est un bon modèle à suivre dans le futur[?]

Verrouillant tout bon gré mal gré est une terrible modèle de conception. Si votre code est encombré par hasard verrouillage et puis vous décidez de l'utiliser un thread d'arrière-plan pour un certain travail, vous êtes confronté à des blocages. Partage d'une ressource entre plusieurs threads nécessite une conception soigneuse, et plus vous pouvez isoler la partie la plus délicate, mieux c'est.

7voto

André Neves Points 3080

Ici toutes les réponses semblent à droite: verrouille l'utilité est de bloquer les fils de acessing verrouillé code en même temps. Cependant, il existe de nombreuses subtilités dans ce domaine, qui est celui qui a verrouillé les blocs de code sont automatiquement marqués en tant que critique régions par le Common Language Runtime.

L'effet du code sera marqué comme étant crucial, c'est que, si l'ensemble de la région ne peut pas être entièrement exécuté, l'exécution peut considérer que l'ensemble de votre Domaine d'Application est potentiellement en danger et, par conséquent, le décharger de la mémoire. Pour citer MSDN:

Par exemple, considérons une tâche qui tente d'allouer de la mémoire tout en maintenant un verrou. Si l'allocation de mémoire échoue, l'abandon de la tâche actuelle n'est pas suffisante pour assurer la stabilité de l'AppDomain, car il peut y avoir d'autres tâches dans le domaine de l'attente pour la même serrure. Si la tâche en cours est terminée, d'autres tâches pourraient être dans l'impasse.

Par conséquent, même si votre demande est mono-thread, ce peut être un danger pour vous. Considérer qu'une méthode enfermé dans un bloc de lève une exception qui n'est finalement pas traitée dans le bloc. Même si l'exception est traitée comme les bulles dans la pile d'appel, votre région critique de code n'a pas fini normalement. Et qui sait comment le CLR va réagir?

Pour plus d'info, lisez cet article sur les dangers de Fil.Abort().

6voto

Will Dean Points 25866

Garder à l'esprit qu'il pourrait y avoir des raisons pour lesquelles votre application n'est pas en tant que single-threaded que vous le pensez. D'e/S asynchrone dans .NET peut appeler l'-retour sur un pool de thread, par exemple, que certaines des différentes classes timer (les Fenêtres ne sont pas les Formes de la Minuterie, tout de même).

2voto

John Christensen Points 3390

En règle générale, si votre application est mono-thread, vous n'allez pas obtenir beaucoup de l'utilisation de l'instruction lock. Ne sachant pas votre application exactement, je ne sais pas si elles sont utiles ou pas - mais je pense que non. De plus, si vous êtes à la demande est à l'aide de verrouillage de partout, je ne sais pas qui je me sentirais tout ce qui confiants quant à elle de travailler dans un environnement multi-thread de toute façon, le développeur d'origine en fait savoir comment développer le code multithread, ou ont-ils tout simplement ajouter de verrouillage états partout dans le vague espoir que cela ferait l'affaire?

1voto

Peter Bernier Points 4404

Vous pouvez avoir des problèmes de performances avec le verrouillage des variables, mais normalement, vous souhaitez construire votre code afin de minimiser les longueurs de temps passé à l'intérieur d'un "verrouillé" bloc de code.

Aussi loin que la suppression des verrous. Ça dépend de ce qu'est exactement le code est fait. Même s'il est mono-thread, si votre objet est mis en œuvre comme un Singleton, il est possible que vous aurez de multiples clients à l'aide d'une instance de celui-ci (dans la mémoire, sur un serveur) en même temps..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X