[解決済み】C++11でローカル静的変数の初期化はスレッドセーフか?重複
2022-04-07 10:26:06
質問
よくある質問だと思いますが、あまりにバリエーションが多いので、改めて記載し、現状を反映した回答ができればと思います。例えば
Logger& g_logger() {
static Logger lg;
return lg;
}
変数 lg のコンストラクタは一度だけ実行されることが保証されていますか?
以前の回答で、C++03ではそうでなく、C++0xドラフトでは、これが強制されることを知っています。しかし、次のような明確な答えが欲しいです。
- C++11標準(ドラフトではない)では、スレッドセーフな初期化動作は確定しているのでしょうか?
- 上記が「はい」の場合、一般的なコンパイラの現在の最新リリース、すなわちgcc 4.7、vc 2011、clang 3.0では、これらは適切に実装されていますか?
解決方法は?
該当する6.7項をご覧ください。
このような変数は、制御がその宣言を最初に通過したときに初期化され、初期化が完了した時点で初期化されたとみなされます。[変数が初期化されている間に制御が宣言に同時に入る場合、同時実行は初期化の完了を待つものとする。
次に脚注です。
実装は、イニシャライザの実行に伴うデッドロックを発生させてはならない。
そう、安全なんですね。
(もちろん、これはその後の参照による変数へのアクセスについては何も言っていません)。
関連
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] なぜリストの初期化(中括弧を使用)が他の方法より優れているのですか?
-
[解決済み】ローカル変数のメモリはスコープ外からアクセスできる?
-
[解決済み】メンバ関数でスレッドを開始する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] MeyersのSingletonパターンの実装はスレッドセーフか?