2009-11-13 7 views
3
  • Nous savons par le C# specification que les références lecture/écriture sont atomiques. Dans une déclaration qui accède à un membre d'un objet, la référence sera-t-elle également accessible de manière atomique? Je pense que oui car c'est aussi une sorte de lecture de référence implicite que le compilateur doit fournir pour l'atomicité tout en générant du code pour celui-ci.Accès aux membres de l'objet et à l'atomicité

  • Dans la même instruction, l'accès à l'objet pour accéder à son membre provoquera la référence des objets conservés afin qu'il ne soit pas collecté lorsque une nouvelle instance est créée par un autre thread? Ainsi, si nous accédons aux membres d'une chaîne, la référence des objets les plus à gauche sera-t-elle également conservée afin qu'elle ne soit pas collectée par d'autres threads?

Considérons le code suivant;

static SomeClass sharedVar; 

void someMethod() 
{ 
    SomeClass someLocalVar = sharedVar.memberX.memberY.a; 
    operations on someLocalVar... 
} 

Je cherche l'explication officielle sur le sujet, de MSDN library spécifications C#, etc. ou les gens de Microsoft pour vous assurer que je ne suis pas casser quelque chose et tout va bien.

Répondre

3
  1. Oui, toutes les lectures de référence sont atomiques.
  2. Lors d'une opération de lecture de champ, une référence ne peut pas être collectée à partir du moment où la valeur est poussée sur la pile tant que la commande .ldfld n'est pas terminée. Sinon, cela permettrait au CLR de collecter un objet que vous utilisiez. Avoir un autre thread créer une instance de la valeur n'est pas lié à ce problème.
  3. Je ne suis pas tout à fait sûr de ce que vous voulez dire par ce dernier point, mais je pense que vous vous inquiétez un peu trop de la récupération de place. Le CLR ne supprimera pas un objet tant que vous l'utilisez encore.
+0

2. Je veux dire que si un autre thread affecte une nouvelle instance à sharedVar, l'ancienne référence est alors éliminée alors que celle-ci accède à sharedVar. 3. Je veux dire quand un point pendant qu'un thread exécute les instructions pour l'instruction SomeClass someLocalVar = sharedVar.memberX.memberY.a; et quand memberY est lu, un autre thread entre en action et assigne null ou nouvel objet à sharedVar. Je ne pense pas que la référence sera tranchée, mais j'hésite et je veux m'assurer avec des documents officiels, des explications? merci. – lockedscope

0

Vous vous inquiétez trop au sujet du GC. Il ne supprimera aucun objet qu'il vous est possible de référencer à l'avenir par un accès &. Seuls les objets totalement inaccessibles seront supprimés.

Questions connexes