¿La inicialización de variables estáticas locales es segura para subprocesos en C++ 11?
static function c (2)
--fno-threadsafe-statics también vale la pena mencionar. En gcc:
No emita el código adicional para usar las rutinas especificadas en C ++ ABI para la inicialización segura de subprocesos de estática local. Puede usar esta opción para reducir el tamaño del código ligeramente en código que no necesita ser seguro para subprocesos.
Además, eche un vistazo al hilo viejo. ¿Las variables estáticas de la función son seguras para hilos en GCC?
Esta pregunta ya tiene una respuesta aquí:
Sé que esta es una pregunta frecuente, pero como hay tantas variantes, me gustaría reformularla y espero tener una respuesta que refleje el estado actual. Algo como
Logger& g_logger() {
static Logger lg;
return lg;
}
¿El constructor de la variable lg garantiza ejecutarse solo una vez?
Sé por respuestas anteriores que en C ++ 03, esto no es así; en borrador de C ++ 0x, esto se aplica. Pero me gustaría una respuesta más clara a
- En C ++ 11 estándar (no borrador), ¿se finalizó el comportamiento de inicialización seguro de subprocesos?
- Si lo anterior es afirmativo, en las últimas versiones actuales de compiladores populares, a saber, gcc 4.7, vc 2011 y clang 3.0, ¿están implementados correctamente?
La sección relevante 6.7:
dicha variable se inicializa la primera vez que el control pasa por su declaración; dicha variable se considera inicializada una vez completada su inicialización. [...] Si el control ingresa la declaración al mismo tiempo que la variable se está inicializando, la ejecución concurrente deberá esperar la finalización de la inicialización.
Luego hay una nota al pie:
La implementación no debe introducir ningún punto muerto alrededor de la ejecución del inicializador.
Entonces sí, estás a salvo.
(Esto no dice nada por supuesto sobre el acceso posterior a la variable a través de la referencia).