/Zc:threadSafeInit (Initialisation statique locale thread-safe)
L’option du compilateur /Zc :threadSafeInit indique au compilateur d’initialiser des variables statiques locales (étendue de fonction) de manière thread-safe, ce qui élimine la nécessité d’une synchronisation manuelle. Seule l’initialisation est thread-safe. L’utilisation et la modification des variables locales statiques par plusieurs threads doivent toujours être synchronisées manuellement. Cette option est disponible à partir de Visual Studio 2015. Par défaut, Visual Studio active cette option.
/Zc :threadSafeInit[-]
Dans la norme C++11, les variables d’étendue de bloc avec une durée de stockage statique ou thread doivent être initialisées zéro avant toute autre initialisation. L’initialisation se produit lorsque le contrôle passe d’abord par la déclaration de la variable. Si une exception est levée lors de l’initialisation, la variable est considérée comme non initialisée et l’initialisation est re-tentée la prochaine fois que le contrôle passe par la déclaration. Si le contrôle entre la déclaration simultanément avec l’initialisation, l’exécution simultanée bloque l’initialisation. Le comportement n’est pas défini si le contrôle entre à nouveau la déclaration de manière récursive pendant l’initialisation. Par défaut, Visual Studio à partir de Visual Studio 2015 implémente ce comportement standard. Ce comportement peut être spécifié explicitement en définissant l’option du compilateur /Zc :threadSafeInit .
L’option du compilateur /Zc :threadSafeInit est activée par défaut. L’option /permissive- n’affecte pas /Zc :threadSafeInit.
L’initialisation thread-safe de variables locales statiques repose sur le code implémenté dans la bibliothèque d’exécution C universelle (UCRT). Pour éviter de prendre une dépendance sur l’UCRT ou pour conserver le comportement d’initialisation non thread-safe des versions de Visual Studio antérieures à Visual Studio 2015, utilisez l’option /Zc :threadSafeInit- . Si vous savez que la sécurité des threads n’est pas nécessaire, utilisez cette option pour générer un code légèrement plus petit et plus rapide autour des déclarations locales statiques.
Les variables locales statiques thread-safe utilisent le stockage local thread-local (TLS) en interne pour fournir une exécution efficace lorsque la statique a déjà été initialisée. L’implémentation de cette fonctionnalité s’appuie sur les fonctions de prise en charge du système d’exploitation Windows dans Windows Vista et les systèmes d’exploitation ultérieurs. Windows XP, Windows Server 2003 et les systèmes d’exploitation plus anciens n’ont pas cette prise en charge. Ils ne bénéficient donc pas de l’avantage d’efficacité. Ces systèmes d’exploitation ont également une limite inférieure au nombre de sections TLS qui peuvent être chargées. Le dépassement de la limite de section TLS peut entraîner un blocage. S’il s’agit d’un problème dans votre code, en particulier dans le code qui doit s’exécuter sur des systèmes d’exploitation plus anciens, utilisez /Zc :threadSafeInit- pour désactiver le code d’initialisation thread-safe.
Pour plus d’informations sur les problèmes de conformité dans Visual C++, consultez Nonstandard Behavior.
Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.
Dans le menu déroulant Configurations , choisissez Toutes les configurations.
Sélectionnez la page de propriétés Propriétés de configuration>C/C++>Ligne de commande.
Modifiez la propriété Options supplémentaires pour inclure /Zc :threadSafeInit ou /Zc :threadSafeInit, puis choisissez OK.
Options du compilateur MSVC
Syntaxe de la ligne de commande du compilateur MSVC
/Zc (Conformité)