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明確請求時纔會創建線程局部變量。