質問: C ++ 11では、ローカル静的変数の初期化はスレッドセーフですか? これはしばしば尋ねられる質問ですが、非常に多くの亜種があるので、私はそれを再述べたいと思います。何かのようなもの ``` Logger& g_logger() { static Logger lg; return lg; } ``` 変数lgのコンストラクタは一度だけ実行することが保証されていますか? 私は以前の答えから、C ++ 03ではこれがそうではないことを知っています。 C ++ 0xドラフトでは、これが強制されます。しかし、私はより明確な答えを望んでいます 1. C ++ 11標準(ドラフトではない)では、スレッドセーフな初期化動作が終了しましたか? 2. 上記がyesの場合、最新のgcc 4.7、vc 2011、clang 3.0の最新のリリースでは、それらが正しく実装されていますか?
回答: 関連するセクション6.7: > > > このような変数は、コントロールが宣言を最初に通過するときに初期化されます。そのような変数は、その初期化の完了時に初期化されたものと見なされます。 > [...]変数が初期化されている間にコントロールが同時に宣言に入ると、並行実行は初期化の完了を待たなければなりません。 > > > 次に脚注があります: > > 実装では、イニシャライザの実行にデッドロックが発生してはなりません。 > > > そう、あなたは安全です。 (これは、参照を介した変数へのその後のアクセスについては何も言及していません)。