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:thread Sejf Init dává kompilátoru pokyn, 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:thread Sejf Init[-]

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:thread Sejf Init.

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

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ávislosti 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:thread Sejf Init- 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 v kódu, zejména v kódu, který musí běžet ve starších operačních systémech, použijte /Zc:thread Sejf Init- 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:thread Sejf Init nebo /Zc:thread Sejf Init- a pak zvolte OK.

Viz také

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