5

Mam następujący bit kodu C++ 11, który używa wątków i zmiennych statycznych inicjalizacji zmiennych. Moje pytanie brzmi:Inferencja statyczna C++ i wątki

Jakie gwarancje lub zapewnienia robi język C++ na temat pojedynczej inicjalizacji zmiennych statycznych - poniższy kod wyświetla poprawne wartości, jednak nie mogę znaleźć fragmentu nowego standardu, który mówi jak model pamięci powinien wchodzić w interakcje z wątkami. Kiedy kiedykolwiek zmienne staną się wątkami lokalnymi?

#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; 
} 

Odpowiedz

8

Kod wykona to, czego oczekujesz. Zobacz §6.7.4

statyczne zmienne lokalne są:

... zainicjowana pierwsza kontrola czasu przechodzi nad swoim oświadczeniu ... Jeśli kontrola wchodzi równocześnie deklarację podczas gdy zmienna jest inicjowany, współbieżne wykonanie powinno czekać na zakończenie inicjowania .

Innymi słowy, kompilator zapewnia, że ​​wątki współpracują przy inicjalizacji lokalnych elementów statycznych. Każda z nich zostanie zainicjowana raz, a każdy wątek będzie miał dostęp do obiektu dopiero po jego całkowitym zainicjowaniu.

Kompilator utworzy tylko zmienną lokalną wątku, gdy zostanie jawnie zażądany za pomocą słowa kluczowego thread_local.