Sdílet prostřednictvím


/Zc:threadSafeInit (lokální statická inicializace bezpečná pro přístup z více vláken)

Možnost kompilátoru /Zc:threadSafeInit kompilátoru říká kompilátoru, aby inicializoval statické místní proměnné (obor funkce) bezpečným způsobem s vlákny a eliminoval potřebu ruční synchronizace. Pouze inicializace je bezpečná pro přístup z více vláken. Použití a úprava statických místních proměnných více vlákny musí být stále ručně synchronizována. Tato možnost je dostupná od sady Visual Studio 2015. Ve výchozím nastavení sada Visual Studio tuto možnost povolí.

Syntaxe

/Zc:threadSafeInit[-]

Poznámky

Ve standardu C++11 musí být proměnné oboru bloku se statickou dobou úložiště nebo úložištěm vláken inicializovány nulou, než proběhne jakákoli jiná inicializace. Inicializace nastane, když ovládací prvek poprvé projde deklarací proměnné. Pokud při inicializaci dojde k výjimce, proměnná se považuje za neinicializovaná a inicializace se znovu pokusí o další průchod ovládacího prvku deklarace. Pokud ovládací prvek zadá deklaraci souběžně s inicializací, budou během inicializace dokončeny souběžné spouštěcí bloky. Chování není definováno, pokud ovládací prvek znovu zadá deklaraci rekurzivně během inicializace. Ve výchozím nastavení sada Visual Studio počínaje sadou Visual Studio 2015 implementuje toto standardní chování. Toto chování může být explicitně určeno nastavením parametru kompilátoru /Zc:threadSafeInit .

Možnost kompilátoru /Zc:threadSafeInit je ve výchozím nastavení zapnutá. Možnost /permissive- nemá vliv na /Zc:threadSafeInit.

Inicializace statických místních proměnných bezpečná pro přístup z více vláken spoléhá na kód implementovaný v knihovně univerzálního běhu C (UCRT). Pokud se chcete vyhnout závislostem na UCRT nebo zachovat chování inicializace bez vláken bezpečné inicializace verzí sady Visual Studio před sadou Visual Studio 2015, použijte možnost /Zc:threadSafeInit- možnost. Pokud víte, že zabezpečení vláken není povinné, použijte tuto možnost k vygenerování mírně menšího a rychlejšího kódu kolem statických místních deklarací.

Statické místní proměnné bezpečné pro přístup z více vláken interně používají interní úložiště TLS (Thread-Local Storage) k zajištění efektivního provádění, pokud již byla statická inicializována. Implementace této funkce závisí na funkcích podpory operačního systému Windows v systémech Windows Vista a novějších operačních systémech. Windows XP, Windows Server 2003 a starší operační systémy tuto podporu nemají, takže nemají výhodu efektivity. Tyto operační systémy mají také nižší limit počtu oddílů PROTOKOLU TLS, které je možné načíst. Překročení limitu oddílu PROTOKOLU TLS může způsobit chybové ukončení. Pokud se jedná o problém ve vašem kódu, zejména v kódu, který musí běžet ve starších operačních systémech, použijte /Zc:threadSafeInit- k zakázání inicializačního kódu bezpečného vlákna.

Další informace o problémech s shodami v jazyce Visual C++ naleznete v tématu Nestandardní chování.

Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. V rozevírací nabídce Konfigurace zvolte Všechny konfigurace.

  3. Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.

  4. Upravte vlastnost Další možnosti tak, aby zahrnovala /Zc:threadSafeInit nebo /Zc:threadSafeInit- a pak zvolte OK.

Viz také

Parametry kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC
/Zc (shoda)