Question

J'ai lu quelque part, même si je ne me souviens plus où, que l'utilisation du mot clé lock en C # peut allouer.

Je sais qu'essayer de verrouiller un ValueType encapsulera le type de valeur, mais existe-t-il d'autres situations?

EDIT ::

  1. Tout le monde semble répondre à la cas de valeur, je le sais déjà!
  2. Je sais aussi ce que sont les serrures et comment les utiliser en profondeur, des conseils généraux sur les meilleures pratiques sont bien - mais inutile;)
  3. j'ai besoin de sais parce que je construis une application XNA pour le déploiement sur la xbox. La xbox ramasse-miettes est vraiment lent - cela signifie que je dois garder allocations au minimum, de préférence inexistant (ce qui empêche la collecteur de jamais en cours d'exécution)
Était-ce utile?

La solution

Alors que l’allocation de see sync block en interne est paresseuse (mais c’est un détail d’implémentation que je connais dans le code IIRC de Essential.NET, ou est-il CLR via C # - et doit être traité comme tel), le le cas où l'élément doit être mis dans la boîte, comme vous le dites, ne se pose pas - voir Pourquoi verrouiller (< entier var >) n'est pas autorisé, mais Monitor.Enter (< entier var >) autorisé?

Autres conseils

Si vous envisagiez d'utiliser:

verrouiller (ceci)

Vous devriez savoir que, parce que vous consultez votre instance, les utilisateurs de votre La classe pourrait également se verrouiller dessus et vous faire foirer. Que ce soit ou non un Le problème dépend de ce que vous pensez que vos utilisateurs pourraient faire. La même situation existe si vous faites:

lock (typeof (MyClass))

Si vous ne voulez pas faire cela, vous pouvez facilement allouer une instance statique ou objet (par exemple, objet myLock = nouvel objet ()), puis verrouillez-le.

Source

Dans la mesure où vous verrouillez un type de référence ou un type de valeur , cela SO question sur le verrouillage d'une ressource une fois obtenue ... a la réponse:

  

Cela dépend du type - si un   type de référence alors oui, si une valeur   type no. C'est aussi pourquoi vous devriez   jamais, jamais verrouiller sur un type de valeur depuis   le type de valeur sera encadré et tout   tentatives ultérieures de verrouiller sur ce   la valeur va effectivement acquérir un verrou sur   un objet différent.

Définition de l'instruction de verrouillage:

  

Instruction de verrouillage (référence C #)

     

Le mot clé lock marque une déclaration   bloquer comme une section critique par   obtention du verrou d'exclusion mutuelle   pour un objet donné, en exécutant une   déclaration, puis relâchant le   verrouiller.

Cette question SO sur le mot clé de verrouillage en C # peut peut-être vous aider. Vous pouvez également consulter Pourquoi lock () est non autorisé, mais Monitor.Enter () autorisé?

La spécification du compilateur définit le comportement de verrou comme ça :

  

Le type de temps de compilation du   l'expression d'une déclaration de verrouillage doit   être un type de référence ou un > type   paramètre (& # 167; 25.1.1) connu pour être un   Type de référence. C'est un temps de compilation   erreur pour le type de temps de compilation du   expression pour désigner un type de valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top