C で頻繁に議論される問題の 1 つは、次のようなローカル静的変数の初期化のスレッドセーフです。次のコード:
Logger& g_logger() { static Logger lg; return lg; }
C 11 標準では、このような初期化の動作が最終決定され、スレッドセーフであることが保証されています。この規格のセクション 6.7 では、「このような変数は、コントロールが初めてその宣言を通過するときに初期化される」こと、および「同時実行は初期化の完了を待つ必要がある」と規定されています。さらに、実装の脚注では、「実装ではイニシャライザの実行周りにデッドロックが発生してはなりません」と明確にされています。
主要なコンパイラ (gcc 4.7、vc 2011、clang 3.0)改訂されたスレッドセーフ要件を正しく実装していること。これは、同時スレッドが存在する場合でも、lg 変数のコンストラクターが 1 回だけ実行されることを意味します。
この保証は初期化自体にのみ適用されることに注意してください。参照を介したその後の変数へのアクセスは、必ずしもスレッドセーフであるとは限りません。
以上がC 11 のローカル静的変数の初期化はスレッドセーフであることが保証されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。