/Zc: threadSafeInit (スレッドセーフなローカル静的初期化)/Zc:threadSafeInit (Thread-safe Local Static Initialization)

/Zc: threadSafeInit コンパイラオプションは、静的ローカル (関数スコープ) 変数をスレッドセーフな方法で初期化するようにコンパイラに指示します。これにより、手動での同期が不要になります。The /Zc:threadSafeInit compiler option tells the compiler to initialize static local (function scope) variables in a thread-safe way, eliminating the need for manual synchronization. 初期化のみがスレッドセーフです。Only initialization is thread-safe. 複数のスレッドによる静的ローカル変数の使用および変更は、それでも手動で同期する必要があります。Use and modification of static local variables by multiple threads must still be manually synchronized. このオプションは、Visual Studio 2015 以降で使用できます。This option is available starting in Visual Studio 2015. 既定では、Visual Studio によってこのオプションが有効になります。By default, Visual Studio enables this option.

構文Syntax

/Zc: threadSafeInit[ - ]/Zc:threadSafeInit[-]

解説Remarks

C++ 11 標準では、静的またはスレッドストレージ存続期間を持つブロックスコープ変数は、他の初期化が行われる前にゼロ初期化する必要があります。In the C++11 standard, block scope variables with static or thread storage duration must be zero-initialized before any other initialization takes place. 初期化は、コントロールが変数の宣言を通過すると発生します。Initialization occurs when control first passes through the declaration of the variable. 初期化中に例外がスローされた場合、変数は初期化されていないと見なされ、次に制御が宣言を通過したときに初期化が再試行されます。If an exception is thrown during initialization, the variable is considered uninitialized, and initialization is re-attempted the next time control passes through the declaration. コントロールが初期化と同時に宣言に入った場合、初期化の完了中に同時実行がブロックされます。If control enters the declaration concurrently with initialization, the concurrent execution blocks while initialization is completed. 初期化中にコントロールが宣言を再帰的に再入力した場合、動作は未定義になります。The behavior is undefined if control re-enters the declaration recursively during initialization. 既定では、visual studio 2015 以降の Visual Studio では、この標準動作が実装されています。By default, Visual Studio starting in Visual Studio 2015 implements this standard behavior. この動作は、 /zc: threadSafeInit コンパイラオプションを設定することによって明示的に指定できます。This behavior may be explicitly specified by setting the /Zc:threadSafeInit compiler option.

/Zc: threadSafeInit コンパイラオプションは、既定でオンになっています。The /Zc:threadSafeInit compiler option is on by default. /Permissive-オプションは、 /Zc: threadsafeinit には影響しません。The /permissive- option does not affect /Zc:threadSafeInit.

静的ローカル変数のスレッドセーフな初期化は、ユニバーサル C ランタイムライブラリ (UCRT) で実装されたコードに依存します。Thread-safe initialization of static local variables relies on code implemented in the Universal C run-time library (UCRT). UCRT への依存関係を回避したり、Visual Studio 2015 より前のバージョンの Visual Studio のスレッドセーフでない初期化動作を維持したりするには、 /zc: threadSafeInit- option を使用します。To avoid taking a dependency on the UCRT, or to preserve the non-thread-safe initialization behavior of versions of Visual Studio prior to Visual Studio 2015, use the /Zc:threadSafeInit- option. スレッドセーフが不要であることがわかっている場合は、このオプションを使用して、静的なローカル宣言について少し小さく、より高速なコードを生成します。If you know that thread-safety is not required, use this option to generate slightly smaller, faster code around static local declarations.

スレッドセーフな静的ローカル変数は、スレッドローカルストレージ (TLS) を内部的に使用して、静的が既に初期化されている場合に効率的な実行を実現します。Thread-safe static local variables use thread-local storage (TLS) internally to provide efficient execution when the static has already been initialized. この機能の実装は、windows Vista 以降のオペレーティングシステムでの Windows オペレーティングシステムのサポート機能に依存しています。The implementation of this feature relies on Windows operating system support functions in Windows Vista and later operating systems. Windows XP、Windows Server 2003、およびそれ以前のオペレーティングシステムでは、このサポートがないため、効率が向上することはありません。Windows XP, Windows Server 2003, and older operating systems do not have this support, so they do not get the efficiency advantage. これらのオペレーティングシステムには、読み込むことができる TLS セクションの数に関する制限もあります。These operating systems also have a lower limit on the number of TLS sections that can be loaded. TLS セクションの制限を超えると、クラッシュが発生する可能性があります。Exceeding the TLS section limit can cause a crash. コードに問題がある場合、特に以前のオペレーティングシステムで実行する必要があるコードでは、 /zc: threadSafeInit- を使用してスレッドセーフな初期化コードを無効にします。If this is a problem in your code, especially in code that must run on older operating systems, use /Zc:threadSafeInit- to disable the thread-safe initialization code.

Visual C++ の準拠に関する問題について詳しくは、「 Nonstandard Behavior」をご覧ください。For more information about conformance issues in Visual C++, see Nonstandard Behavior.

Visual Studio 開発環境でこのコンパイラ オプションを設定するにはTo set this compiler option in the Visual Studio development environment

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。Open the project's Property Pages dialog box. 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関するページを参照してください。For details, see Set C++ compiler and build properties in Visual Studio.

  2. [ 構成 ] ドロップダウンメニューから、[ すべての構成] を選択します。From the Configurations drop down menu, choose All Configurations.

  3. [構成プロパティ] [ > C/c + + > コマンドライン] プロパティページを選択します。Select the Configuration Properties > C/C++ > Command Line property page.

  4. /Zc: threadsafeinit または /Zc: threadsafeinit を含むように "追加オプション" プロパティを変更し、[ OK] を選択します。Modify the Additional Options property to include /Zc:threadSafeInit or /Zc:threadSafeInit- and then choose OK.

関連項目See also

MSVC コンパイラ オプションMSVC Compiler Options
MSVC Compiler Command-Line 構文MSVC Compiler Command-Line Syntax
/Zc (準拠)/Zc (Conformance)