/Zc:threadSafeInit (Inicialización estática local segura para subprocesos)
La opción del compilador /Zc:threadSafeInit indica al compilador que inicialice las variables locales estáticas (ámbito de función) de forma segura para subprocesos, lo que elimina la necesidad de una sincronización manual. Solo la inicialización es segura para subprocesos. Todavía debe sincronizarse manualmente el uso y la modificación de variables locales estáticas por parte de varios subprocesos. Esta opción está disponible a partir de Visual Studio 2015. De forma predeterminada, Visual Studio habilita esta opción.
Sintaxis
/Zc:threadSafeInit[-]
Comentarios
En el estándar C++11, las variables de ámbito de bloque con duración de almacenamiento estático o de subprocesos deben inicializarse en cero antes de que se realice cualquier otra inicialización. La inicialización se produce cuando el control pasa por primera vez a través de la declaración de la variable. Si se produce una excepción durante la inicialización, la variable se considera no inicializada y se vuelve a intentar la inicialización la próxima vez que el control pase a través de la declaración. Si el control entra en la declaración de forma simultánea con la inicialización, la ejecución simultánea se bloquea mientras se completa la inicialización. El comportamiento es indefinido si el control vuelve a entrar en la declaración de manera recursiva durante la inicialización. De forma predeterminada, Visual Studio implementa este comportamiento estándar a partir de Visual Studio 2015. El comportamiento se puede especificar explícitamente si se establece la opción del compilador /Zc:threadSafeInit.
Dicha opción del compilador, /Zc:threadSafeInit, está activada de forma predeterminada. La opción /permissive- no afecta a /Zc:threadSafeInit.
La inicialización segura para subprocesos de las variables locales estáticas se basa en el código implementado en la biblioteca en tiempo de ejecución universal de C (UCRT). Para evitar depender de UCRT o conservar el comportamiento de inicialización no seguro para subprocesos de las versiones de Visual Studio anteriores a Visual Studio 2015, use la opción /Zc:threadSafeInit-. Si sabe que no se requiere seguridad para subprocesos, use esta opción para generar código algo más reducido y rápido para las declaraciones locales estáticas.
Las variables locales estáticas seguras para subprocesos usan el almacenamiento local para el subproceso (TLS) internamente a fin de proporcionar una ejecución eficaz cuando ya se ha inicializado el elemento estático. La implementación de esta característica se basa en las funciones de compatibilidad del sistema operativo Windows en Windows Vista y en los sistemas operativos posteriores. Windows XP, Windows Server 2003 y los sistemas operativos anteriores no son compatibles con esta característica, por lo que no obtienen la ventaja de eficiencia. Además, estos sistemas operativos también tienen un límite más bajo respecto al número de secciones TLS que se pueden cargar. Si se supera el límite de secciones TLS, puede producirse un bloqueo. Si esto supone un problema en el código, especialmente en el código que debe ejecutarse en sistemas operativos anteriores, use /Zc:threadSafeInit- para deshabilitar el código de inicialización seguro para subprocesos.
Para obtener más información sobre los problemas de conformidad de Visual C++, vea Nonstandard Behavior.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.
En el menú desplegable Configuraciones, elija Todas las configuraciones.
Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.
Modifique la propiedad Opciones adicionales para incluir /Zc:threadSafeInit o /Zc:threadSafeInit- y luego elija Aceptar.
Consulte también
Opciones del compilador de MSVC
Sintaxis de la línea de comandos del compilador MSVC
/Zc (Ajuste)