/Zc: threadSafeInit (スレッドセーフなローカルでの静的な初期化)

/Zc:threadSafeInit コンパイラ オプションは、静的ローカル (関数スコープ) 変数をスレッドセーフな方法で初期化するようにコンパイラに指示します。これにより、手動による同期の必要がなくなります。 スレッドセーフなのは初期化のみです。 複数のスレッドによる静的ローカル変数の使用と変更は、手動で同期する必要があります。 このオプションは、Visual Studio 2015 以降で使用できます。 既定では、Visual Studio によってこのオプションが有効になります。

構文

/Zc:threadSafeInit[-]

解説

C++ 11 標準では、静的またはスレッド ストレージ存続期間があるブロック スコープ変数は、他の初期化が行われる前にゼロに初期化する必要があります。 初期化は、コントロールが変数の宣言を最初に通過する際に発生します。 初期化中に例外がスローされた場合、変数は初期化されていないと見なされ、制御が次に宣言を通過する際に初期化が再試行されます。 制御が初期化と同時に宣言に入った場合、同時実行は初期化が完了までの間ブロックされます。 初期化中に制御が再帰的に宣言に入った場合、動作は未定義です。 既定では、Visual Studio 2015 以降の Visual Studio にはこの標準の動作が実装されます。 これは、/Zc:threadSafeInit コンパイラ オプションを設定することで明示的に指定できます。

/Zc:threadSafeInit コンパイラ オプションは、既定でオンになっています。 /permissive- オプションは、/Zc:threadSafeInit に影響しません。

静的ローカル変数のスレッドセーフな初期化は、ユニバーサル C ランタイム ライブラリ (UCRT) で実装されたコードに依存します。 UCRT に依存しないようにする場合や、Visual Studio 2015 より前のバージョンの Visual Studio の、スレッドセーフではない初期化動作を維持する場合には、/Zc:threadSafeInit- オプションを使用してください。 スレッドセーフが不要であることがわかっている場合は、このオプションを使用して、静的ローカル宣言に関連するコードを幾分小さくし、処理を高速化してください。

スレッドセーフな静的ローカル変数では、スレッド ローカル ストレージ (TLS) を内部的に使用することで、静的変数が既に初期化されている場合に、効率的な実行を実現できます。 この機能の実装は、Windows Vista 以降のオペレーティング システムでの、Windows オペレーティング システム サポート機能に依存します。 Windows XP、Windows Server 2003、およびそれ以前のオペレーティング システムでは、このサポートがないため、効率を向上させることはできません。 これらのオペレーティング システムには、読み込むことができる TLS セクションの数に関する制限もあります。 TLS セクションの制限を超えると、クラッシュが発生する可能性があります。 ご使用のコードにこの問題がある場合、特に以前のオペレーティング システムで実行する必要があるコードでは、/Zc:threadSafeInit- を使用してスレッドセーフな初期化コードを無効にしてください。

Visual C++ の準拠に関する問題について詳しくは、「 Nonstandard Behavior」をご覧ください。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成] ドロップ ダウン メニューで、[すべての構成] を選択します。

  3. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  4. /Zc:threadSafeInit または /Zc:threadSafeInit- が含まれるように [追加オプション] プロパティを変更し、[OK] をクリックします。

関連項目

MSVC コンパイラ オプション
MSVC コンパイラ コマンド ラインの構文
/Zc (準拠)