5

Ho il seguente bit di codice C++ 11 che utilizza i thread e le inizializzazioni delle variabili statiche. La mia domanda è:Inalization e thread delle variabili statiche C++

Quali garanzie o assicurazioni fa il linguaggio C++ sulla singola inizializzazione di variabili statiche - il codice sotto mostra i valori corretti, tuttavia non riesco a trovare il passaggio nel nuovo standard che menziona come il modello di memoria dovrebbe interagire con i thread. Quando mai le variabili diventano thread-local?

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

risposta

8

Il codice farà ciò che ci si aspetta. Vedere §6.7.4

variabili locali statiche sono:

... inizializzato la prima volta il controllo passa sopra la sua dichiarazione ... Se il controllo entra nella dichiarazione simultaneamente mentre è inizializzato la variabile, l'esecuzione simultanea deve attendere il completamento dell'inizializzazione.

In altre parole, il compilatore garantisce che i thread collaborino all'inizializzazione dei locals statici. Saranno inizializzati ciascuno una volta e ogni thread avrà accesso all'oggetto solo dopo che è stato inizializzato completamente.

Il compilatore creerà solo una variabile locale del thread quando richiesto esplicitamente con la parola chiave thread_local.

Problemi correlati