¿La inicialización de variables estáticas locales es segura para subprocesos en C++ 11? [duplicar]
Sé que esta es una pregunta que se hace con frecuencia, pero como hay tantas variantes, me gustaría volver a formularla y, con suerte, tener una respuesta que refleje el estado actual. Algo como
Logger& g_logger() {
static Logger lg;
return lg;
}
¿Se garantiza que el constructor de la variable lg se ejecutará solo una vez?
Sé por respuestas anteriores que en C++03, esto no es así; en el borrador de C++ 0x, esto se aplica. Pero me gustaría una respuesta más clara a
- En el estándar C++ 11 (no en el borrador), ¿está finalizado el comportamiento de inicialización seguro para subprocesos?
- Si la respuesta anterior es afirmativa, en las últimas versiones actuales de compiladores populares, concretamente gcc 4.7, vc 2011 y clang 3.0, ¿están implementados correctamente?
La sección pertinente 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 se inicializa la variable, la ejecución concurrente esperará a que se complete la inicialización.
Luego hay una nota al pie:
La implementación no debe introducir ningún punto muerto en la ejecución del inicializador.
Entonces sí, estás a salvo.
(Por supuesto, esto no dice nada sobre el acceso posterior a la variable a través de la referencia).
--fno-threadsafe-statics también vale la pena mencionar. En gcc:
No emita el código adicional para usar las rutinas especificadas en la ABI de C++ para la inicialización segura de subprocesos de estática local. Puede utilizar esta opción para reducir ligeramente el tamaño del código en código que no necesita ser seguro para subprocesos.
Además, eche un vistazo al hilo anterior. ¿ Las variables estáticas de función son seguras para subprocesos en GCC?