¿Las variables static locales son automáticamente subprocesos locales o se comparten entre subprocesos?
void f() { static int x; // <-- need explicit _Thread_local ? }static y _Thread_local especifican dos cosas diferentes.
Una variable declarada como static tiene una duración de almacenamiento estática y tiene una vida útil completa del programa. Una variable declarada _Thread_local tiene una duración de almacenamiento de subprocesos y existe una instancia para cada subproceso.
Había static para las variables de alcance de bloque antes de que la especificación del lenguaje C reconociera los subprocesos o tuviera algún soporte para ellos, mucho menos _Thread_local específicamente. En ese contexto, cuando no se combina con _Thread_local , especifica la duración del almacenamiento estático , lo que significa que la variable existe (como si) al comienzo de la ejecución del programa y existe y mantiene su último valor almacenado durante toda la ejecución del programa. Todos los subprocesos comparten un objeto con duración de almacenamiento estático.
Por otro lado, _Thread_local siempre especifica la duración del almacenamiento del subproceso , lo que significa que el objeto así declarado existe y mantiene su último valor almacenado durante toda la vida útil de un subproceso, y que el identificador declarado designa un objeto diferente en cada subproceso. Cuando un objeto se declara _Thread_local en el alcance del bloque, también debe tener el calificador extern o static , que transmite su vinculación : externa o ninguna.
Las declaraciones extern de cualquier tipo en el alcance del bloque son inusuales, pero ocasionalmente tienen un propósito útil. Sin embargo, la mayoría de las veces, static _Thread_local es lo que deseará para las variables locales de subprocesos y alcance de bloque.
Son valor compartido entre hilos. Como ya lo mencionó usted mismo, si desea que tenga un valor independiente para cada subproceso, declárelo como una línea que _Thread_local static int x;