¿Cómo funciona el [ThreadStatic]
atributo? Supuse que el compilador emitiría algo de IL para rellenar / recuperar el valor en el TLS, pero mirando un desmontaje no parece hacerlo a ese nivel.
Como seguimiento, ¿qué sucede si lo pones en un miembro no estático? Hicimos que un desarrollador cometiera ese error y el compilador ni siquiera ofrece una advertencia.
Actualizar
Segunda pregunta respondida aquí: ThreadStatic modificado con Static C #
c#
static
threadstatic
joshperry
fuente
fuente
Respuestas:
La semántica de implementación de hilo estático está por debajo del nivel IL, en el compilador .NET jit. Los compiladores que emiten a IL como VB.NET y C # no necesitan saber nada sobre Win32 TLS para emitir código IL que pueda leer y escribir una variable que tenga el atributo ThreadStatic. No hay nada especial en la variable hasta donde C # sabe: es solo una ubicación para leer y escribir cosas. El hecho de que tenga un atributo no tiene consecuencias para C #. C # solo necesita saber para emitir IL leer o escribir instrucciones para ese nombre de símbolo.
El 'levantamiento pesado' lo realiza el CLR central que es responsable de hacer que el IL funcione en una arquitectura de hardware particular.
Eso también explicaría por qué poner el atributo en un símbolo inapropiado (no estático) no obtiene una reacción del compilador. El compilador no sabe qué semántica especial requiere el atributo. Sin embargo, las herramientas de análisis de código como FX / Cop deberían saberlo.
Otra forma de verlo: CIL define un conjunto de ámbitos de almacenamiento: almacenamiento estático (global), almacenamiento de miembros y almacenamiento de pila. TLS no está en esa lista, muy probablemente porque TLS no necesita estar en esa lista. Si las instrucciones de lectura y escritura de IL son suficientes para acceder a TLS cuando el símbolo está etiquetado con un atributo TLS, ¿por qué IL debería tener alguna representación o tratamiento especial para TLS? No es necesario
fuente
Puede pensar que el campo marcado con ThreadStatic está conectado a un subproceso y su duración es comparable a la duración de un subproceso.
Entonces, en pseudocódigo
ThreadStatic
es similar (por semántica) a tener un valor clave adjunto a un hilo:pero la sintaxis es un poco más fácil:
Creo que se ignora:
Además, vale la pena mencionar que
ThreadStatic
no requiere ningún mecanismo de sincronización en comparación con los campos estáticos normales (porque el estado no se comparte).fuente
"MyClass.myVariable"
, ¿no?TransactionScope
, almacenan todo tipo de cosas allí para el alcance ( referencesource.microsoft.com/#System.Transactions/System/… )[ThreadStatic] crea versiones aisladas de la misma variable en cada hilo.
Ejemplo:
fuente
El campo marcado con
[ThreadStatic]
se crean en el Almacenamiento local de subprocesos, por lo que cada subproceso tiene su propia copia del campo, es decir, el alcance de los campos es local para el subproceso.Los campos TLS son de acceso a través de registros de segmentos gs / fs. Estos segmentos son utilizados por los núcleos del sistema operativo para acceder a la memoria específica de subprocesos. El compilador .net no emite ningún IL para rellenar / recuperar el valor en el TLS. Lo hace el núcleo del sistema operativo.
fuente