10

C ++ 03標準の時点では、関数スコープの静的初期化がスレッドセーフであることが保証されていないことを私は知っています。

void moo()
{
    static std::string cat("argent");  // not thread safe
    ...
}

C ++ 0x標準が最終的に標準スレッドサポートを提供するので、関数スコープの静的初期化はスレッドセーフである必要がありますか?

4

1 に答える 1

9

オブジェクトが関数に入ったときに動的に初期化される場合、クリティカルセクションで実行されることが保証されるため、初期化はスレッドセーフになるようです。

§ 6.7 stmt.decl

4. ...そのようなオブジェクトは、最初に制御がその宣言を通過するときに初期化されます...オブジェクトの初期化中に制御が同時に宣言に入ると、同時実行は初期化の完了を待ちます...

main() から戻った後、静的ローカルが既に破棄された後に静的オブジェクトのデストラクタが関数を呼び出す場合、動作は未定義です。ただし、これは簡単に回避できるはずです。

于 2010-01-01T02:09:57.553 に答える