156 votes

Comment le ThreadStatic attribut de travail?

Comment est - [ThreadStatic] attribut de travail? Je suppose que le compilateur pourrait émettre quelques IL de stuff/récupérer la valeur dans le TLS, mais en regardant un démontage, il ne semble pas faire à ce niveau.

Comme un suivi, ce qui se passe si vous le mettez sur un non-membre statique? Nous avons eu un développeur de faire cette erreur et le compilateur n'a même pas proférer un avertissement.

Mise à jour

Deuxième question, la réponse est ici: ThreadStatic Modifié Statique en C#

126voto

Dmytrii Nagirniak Points 10979

Comment est-ce que [ThreadStatic] attribut travail?

Vous pouvez penser que le champ marqué avec ThreadStatic est attaché à un fil et sa durée de vie est comparable à la durée de vie d'un thread.

Ainsi, dans de pseudo - ThreadStatic est similaire (par la sémantique) pour avoir une valeur-clé attaché à un fil:

Thread.Current["MyClass.myVariable"] = 1;
Thread.Current["MyClass.myvariable"] += 1;

mais la syntaxe est juste un peu plus facile:

class MyClass {
  [ThreadStatic]
  static int myVariable;
}
// .. then
MyClass.myVariable = 1;
MyClass.myVariable += 1;

qu'advient-il si vous le mettez sur un non-membre statique?

Je crois qu'il est ignoré:

    class A {
        [ThreadStatic]
        public int a;
    }
    [Test]
    public void Try() {
        var a1 = new A();
        var a2 = new A();
        a1.a = 5;
        a2.a = 10;
        a1.a.Should().Be.EqualTo(5);
        a2.a.Should().Be.EqualTo(10);
    }

En outre, il est utile de mentionner que, ThreadStatic ne nécessite pas de synchronisation par rapport à la normale champs statiques (parce que l'état n'est pas partagé).

102voto

dthorpe Points 23314

La mise en œuvre de la sémantique de fil statique sont en dessous du niveau IL, dans le .NET compilateur jit. Les compilateurs qui émettent à IL aime VB.NET et C# n'avez pas besoin de savoir quelque chose au sujet de Win32 TLS afin d'émettre code IL capable de lire et d'écrire une variable qui a le ThreadStatic attribut. Il n'y a rien de spécial à propos de la variable dans la mesure du C# sait - c'est juste un endroit pour lire et écrire des trucs. Le fait qu'il dispose d'un attribut, il est sans conséquence pour C#. C# a seulement besoin de savoir pour émettre de la IL lire ou écrire des instructions pour que le nom du symbole.

Le "lourd de levage" est fait par le CLR de base qui est responsable de la prise de IL travail sur une architecture matérielle particulière.

Cela expliquerait également pourquoi mettre l'attribut sur un inappropriée (non statique) symbole n'est pas d'obtenir une réaction de la part du compilateur. Le compilateur ne sait pas quelles sont les particularités de la sémantique de l'attribut nécessite. Outils d'analyse de Code comme FX/Cop, mais, devrait le savoir.

Une autre façon de voir les choses: CIL définit un ensemble de champs de stockage: statique (global) de stockage, membre de stockage, et de la pile de stockage. TLS n'est pas sur la liste, très probablement parce que TLS n'a pas besoin d'être sur cette liste. Si IL lire et écrire des instructions suffisantes pour accéder à TLS lorsque le symbole est marqué avec un TLS attribut, pourquoi devrait-IL avoir une quelconque représentation ou de traitement pour TLS? Il n'est pas nécessaire.

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