ホームページ >バックエンド開発 >C++ >C 11 のローカル静的変数の初期化はスレッドセーフであることが保証されていますか?

C 11 のローカル静的変数の初期化はスレッドセーフであることが保証されていますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 06:45:10812ブラウズ

Is C  11 Local Static Variable Initialization Guaranteed to be Thread-Safe?

C でのスレッドセーフなローカル静的変数の初期化の保証 11

C で頻繁に議論される問題の 1 つは、次のようなローカル静的変数の初期化のスレッドセーフです。次のコード:

Logger& g_logger() {
    static Logger lg;
    return lg;
}

C 11 標準とスレッド安全性

C 11 標準では、このような初期化の動作が最終決定され、スレッドセーフであることが保証されています。この規格のセクション 6.7 では、「このような変数は、コントロールが初めてその宣言を通過するときに初期化される」こと、および「同時実行は初期化の完了を待つ必要がある」と規定されています。さらに、実装の脚注では、「実装ではイニシャライザの実行周りにデッドロックが発生してはなりません」と明確にされています。

コンパイラの実装

主要なコンパイラ (gcc 4.7、vc 2011、clang 3.0)改訂されたスレッドセーフ要件を正しく実装していること。これは、同時スレッドが存在する場合でも、lg 変数のコンストラクターが 1 回だけ実行されることを意味します。

この保証は初期化自体にのみ適用されることに注意してください。参照を介したその後の変数へのアクセスは、必ずしもスレッドセーフであるとは限りません。

以上がC 11 のローカル静的変数の初期化はスレッドセーフであることが保証されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。