c++ - tipos - ¿Puedes usar variables locales de hilo dentro de una clase o estructura?
variables estaticas en c (6)
De acuerdo con el antiguo libro de Petzold ''Programación de Windows'' (página 1241), marca una variable como hilo local usando las palabras clave: __declspec (hilo). Entonces, por ejemplo: __declspec (thread) int iGlobal = 1;
Aunque dudo que esto se pueda hacer en una clase. También puedes hacer la variable estática también. [editar] me di cuenta de que probablemente no estés ejecutando en Windows ... Así que supongo que para cualquiera que necesite una respuesta de Windows, esto puede ser relevante.
Me gusta esto.
struct some_struct
{
// Other fields
.....
__thread int tl;
}
Estoy tratando de hacer eso, pero el compilador me está dando este error.
./cv.h:16:2: error: ''__thread'' is only allowed on variable declarations
__thread int tl;
Debes cambiar __thread int tl;
a thread_local static int tl;
El almacenamiento local de subprocesos se aplica solo a variables estáticas. No tiene sentido que los miembros de la clase o de la estructura no estática sean locales de subprocesos.
Las variables locales (automáticas) siempre son específicas del subproceso que ejecuta el código, pero las variables globales y estáticas se comparten entre los subprocesos, ya que residen en el segmento de datos o BSS. TLS proporciona un mecanismo para hacer que esas variables globales sean locales para el subproceso y eso es lo que logra la palabra clave __thread
: instruye al compilador para que cree una copia separada de la variable en cada subproceso, mientras que léxicamente sigue siendo global (por ejemplo, se puede acceder a él mediante Diferentes funciones llamadas dentro del mismo hilo de ejecución).
Los miembros de la clase no estática y los miembros de la estructura se colocan en el mismo lugar donde se asigna el objeto (clase o estructura), ya sea en la pila si se declara una variable automática o en el montón si se usa new
o malloc()
. De cualquier manera, cada subproceso recibe una ubicación de almacenamiento única para la variable y __thread
no es aplicable en este caso, por lo tanto, se __thread
el error de compilación.
Norma C11 Sección 6.7.1 Párrafo 2
A lo sumo, se puede dar un especificador de clase de almacenamiento en los especificadores de declaración en una declaración, excepto que _Thread_local puede aparecer con static o extern.120)
Norma C11 Sección 6.7.1 Párrafo 3
En la declaración de un objeto con ámbito de bloque, si los especificadores de declaración incluyen _Thread_local, también incluirán estática o externa. Si _Thread_local aparece en cualquier declaración de un objeto, estará presente en cada declaración de ese objeto.
Para C, esto no tiene mucho sentido, static
miembros static
(= globales) son solo una característica de C ++. Y así, el nuevo estándar C11 (que introduce _Thread_local
) no lo permite. Estas bestias se permiten básicamente en todas partes donde se permite una variable con duración de almacenamiento estática.
Para C ++, esto podría tener sentido dentro de una clase como análogo a un miembro static
, pero si C ++ 11 lo permite, no tengo idea.
gcc
impone las siguientes restrictions en el uso de __thread
:
El
__thread
specifier puede aplicarse a cualquier miembro de datos estáticos globales, estáticos con ámbito de archivos, estáticos con funciones específicas o estáticos de una clase. Puede que no se aplique a miembros de datos automáticos o no estáticos de ámbito de bloque.
El modificador __thread
es compatible con varios compiladores. No es inconcebible que las restricciones exactas varíen un poco de compilador a compilador.