5

スレッドと静的変数の初期化を使用するC++ 11コードの次のビットがあります。私の質問は次のとおりです:C++静的変数の初期化とスレッド

C++言語は静的変数の単一の初期化について何を保証していますか?以下のコードは正しい値を表示しますが、新しい標準ではどのように記述されているのかわかりませんメモリモデルはスレッドと対話する必要があります。変数がスレッドローカルになるのはいつですか?

#include <iostream> 
#include <thread> 

class theclass 
{ 
public: 
    theclass(const int& n) 
    :n_(n) 
    { printf("aclass(const int& n){}\n"); } 
    int n() const { return n_; } 
private: 
    int n_; 
}; 

int operator+(const theclass& c, int n) 
{ 
    return c.n() + n; 
} 

void foo() 
{ 
    static theclass x = 1; 
    static theclass y = x + 1; 
    printf("%d %d\n",x.n(),y.n()); 
} 

int main() 
{ 
    std::thread t1(&foo); 
    std::thread t2(&foo); 
    t1.join(); 
    t2.join(); 
    return 0; 
} 

答えて

8

コードは期待どおりに動作します。変数が初期化されている いる間に制御が同時に宣言を入力した場合、 ...その宣言の上に最初の時間制御パスを初期化...

:§6.7.4

静的ローカル変数は参照してください。同時実行は完了の完了を待たなければならない。 初期化。

つまり、コンパイラは、スレッドが静的ローカルの初期化に協力することを保証します。それらはそれぞれ一度だけ初期化され、完全に初期化された後に各スレッドはオブジェクトにアクセスできます。

コンパイラは、thread_localキーワードで明示的に要求された場合にのみ、スレッドローカル変数を作成します。

関連する問題