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.
thread_local
Para empezar, tener una variable local no tiene sentido ... cada hilo tiene su propia pila de llamadas.