¿Hay alguna diferencia entre estos dos segmentos de código?
void f() {
thread_local vector<int> V;
V.clear();
... // use V as a temporary variable
}
y
void f() {
static thread_local vector<int> V;
V.clear();
... // use V as a temporary variable
}
Trasfondo: originalmente tenía un vector ESTÁTICO V (para contener algunos valores intermedios, se borra cada vez que entro a la función) y un programa de un solo subproceso. Quiero convertir el programa en uno de subprocesos múltiples, así que de alguna manera tengo que deshacerme de este modificador estático. ¿Mi idea es convertir cada estática en thread_local y no preocuparme por nada más? ¿Puede este enfoque ser contraproducente?
thread_local
Para empezar, tener una variable local no tiene sentido ... cada hilo tiene su propia pila de llamadas.static
lugar destatic thread_local
no inicializar una instancia de la variable para cada hilo.static
vs,static thread_local
sino más bien deauto
vsthread_local
, usando el significado de antes de C ++ 11auto
(es decir, almacenamiento automático).Respuestas:
Según el estándar C ++
Entonces significa que esta definición
void f() { thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }
es equivalente a
void f() { static thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }
Sin embargo, una variable estática no es lo mismo que una variable thread_local.
Para distinguir estas variables, el estándar introduce un nuevo término duración de almacenamiento de subprocesos junto con duración de almacenamiento estático.
fuente
static
y,extern
por lo tanto, no implica una clase de almacenamiento, sino solo un enlace para las variables thread_local incluso en ámbitos internos.Sí, el "almacenamiento local de subprocesos" es muy similar a "global" (o "almacenamiento estático"), solo que en lugar de "duración de todo el programa" tienes "duración de todo el subproceso". Entonces, una variable local de subproceso local de bloque se inicializa la primera vez que el control pasa por su declaración, pero por separado dentro de cada subproceso, y se destruye cuando el subproceso termina.
fuente
Cuando se usa con
thread_local
,static
está implícito en el alcance del bloque (vea la respuesta de @ Vlad), requerido para un miembro de la clase; Supongo que significa enlace para el alcance del espacio de nombres.Por 9.2 / 6:
Para responder a la pregunta original:
No hay otra opción, excepto para las variables de ámbito de espacio de nombres.
No.
fuente
El almacenamiento local de subprocesos es estático, pero se comporta de manera bastante diferente al almacenamiento estático simple.
Cuando declaras una variable estática, hay exactamente una instancia de la variable. El compilador / sistema de tiempo de ejecución garantiza que se inicializará en algún momento antes de que realmente lo use, sin especificar exactamente cuándo (algunos detalles se omiten aquí).
C ++ 11 garantiza que esta inicialización será segura para subprocesos, sin embargo, antes de C ++ 11, esta seguridad para subprocesos no estaba garantizada. Por ejemplo
static X * pointer = new X;
podría filtrar instancias de X si más de un subproceso golpea el código de inicialización estático al mismo tiempo.
Cuando declaras un hilo de variable como local, hay potencialmente muchas instancias de la variable. Puede pensar en ellos como si estuvieran en un mapa indexado por thread-id. Eso significa que cada hilo ve su propia copia de la variable.
Una vez más, si se inicializa la variable, el compilador / sistema de tiempo de ejecución garantiza que esta inicialización ocurrirá antes de que se usen los datos y que la inicialización ocurrirá para cada hilo que use la variable. El compilador también garantiza que el inicio será seguro para subprocesos.
Las garantías de seguridad de subprocesos significan que puede haber bastante código detrás de escena para hacer que la variable se comporte de la manera esperada, especialmente considerando que el compilador no tiene forma de saber de antemano exactamente cuántos subprocesos existen en su programa y cuántos de estos tocarán la variable local del hilo.
fuente